1. Lista de tipos primitivos
Java tiene 8 tipos primitivos básicos. Se llaman primitivos porque los valores de estos tipos no son objetos y se almacenan directamente dentro de las variables.
Aquí hay una tabla con una breve información sobre estos tipos:
Tipo | Tamaño en bytes |
Rango de valores | Valor por defecto | Descripción |
---|---|---|---|---|
byte |
1 | -128 .. 127 | 0 |
El tipo entero más pequeño es un solo byte |
short |
2 | -32.768 .. 32.767 | 0 |
Entero corto, dos bytes |
int |
4 | -2*10 9 .. 2*10 9 | 0 |
Entero, 4 bytes |
long |
8 | -9*10 18 .. 9*10 18 | 0L |
Entero largo, 8 bytes |
float |
4 | -10 38 .. 10 38 | 0.0f |
Número de punto flotante, 4 bytes |
double |
8 | -10 308 .. 10 308 | 0.0d |
Número de coma flotante de precisión doble, 8 bytes |
boolean |
1 | true ,false |
false |
Tipo booleano (solo true y false ) |
char |
2 | 0 .. 65.535 | '\u0000' |
Caracteres, 2 bytes, todos mayores que 0 |
Por cierto, aquí hay un matiz importante. Si declara una variable de instancia (campo) o una variable de clase estática y no le asigna ningún valor inmediatamente, entonces se inicializa con un valor predeterminado . La tabla presenta una lista de estos valores.
Las variables locales en un método no tienen valor predeterminado. Si no asigna un valor a tales variables, se consideran no inicializadas y no se pueden utilizar.
Pero volvamos a los tipos primitivos y echemos un vistazo más de cerca.
2. Tipos enteros
Java tiene 4 tipos de enteros : byte
, short
y int
. long
Se diferencian en su tamaño y en el rango de valores que pueden almacenar.
int
tipo
El más utilizado es el int
tipo. El nombre proviene de la palabra int eger (número entero). Todos los literales enteros (números enteros) en el código son ints
(si no terminan en L
, F
o D
).
Las variables de este tipo pueden tomar valores desde -2,147,483,648
hasta +2,147,483,647
.
Eso es mucho y es suficiente para casi todas las ocasiones. Casi todas las funciones que devuelven un número devuelven un int
.
Ejemplos:
Código | Explicación |
---|---|
|
El length() método devuelve la longitud de una cadena. |
|
El length campo contiene la longitud de la matriz. |
short
tipo
El short
tipo recibe su nombre de short int
. A menudo también se le llama entero corto . A diferencia del int
tipo, su longitud es de solo dos bytes y el rango de valores posibles es de -32,768
a +32,767
.
Eso significa que no puede almacenar el número un millón en él. O incluso 50.000. Este es el tipo entero que se usa con menos frecuencia en Java. La principal motivación para usarlo es conservar la memoria.
Suponga que tiene una situación en la que sabe de antemano que trabajará con valores que nunca superan los 30.000, y habrá millones de estos valores.
Por ejemplo, supongamos que está escribiendo una aplicación que procesa imágenes de ultra alta definición que utilizan 10
-bits por color. Y tienes un millón de píxeles en tu imagen. Este es un escenario donde la decisión de usar int
o short
importa.
long
tipo
Este tipo recibe su nombre long int
y también se le llama entero largo . A diferencia del int
tipo, tiene un rango de valores fabulosamente enorme: de a .-9*1018
+9*1018
¿Por qué no es el tipo entero básico?
Porque Java apareció a mediados de los 90, cuando la mayoría de las computadoras eran de 32 bits. Eso significa que todos los procesadores fueron optimizados para trabajar con números de 32 bits. Los procesadores podían trabajar con enteros de 64 bits, pero las operaciones con ellos eran más lentas.
Como resultado, los programadores razonablemente decidieron hacer int
el tipo entero estándar y usar el long
tipo solo cuando fuera realmente necesario.
byte
tipo
Este es el tipo entero más pequeño en Java, pero está lejos de ser el menos utilizado. Su nombre, byte
, es también la palabra para el bloque de memoria direccionable más pequeño en Java.
No hay tantos valores válidos para el byte
tipo: from -128
to +127
. Pero ese no es su punto fuerte. El byte
tipo se usa con mayor frecuencia cuando necesita almacenar una gran cantidad de datos de blobs en la memoria. Una matriz de byte
s es ideal para este propósito.
Suponga que necesita copiar un archivo en alguna parte.
No necesita procesar el contenido del archivo: solo desea crear un área de memoria (búfer), copiar el contenido del archivo en él y luego escribir esos datos del búfer en otro archivo. Una byte
matriz es lo que necesitas para esto.
Tenga en cuenta que una variable de matriz solo almacena una referencia a un área de memoria. Cuando la variable se pasa a algún método, solo se pasa la dirección de memoria. El bloque de memoria en sí no se copia.
byte[] buffer = new byte[1024*1024];
FileInputStream sourceFile = new FileInputStream("c:\\data.txt");
FileOutputStream destFile = new FileOutputStream("c:\\output.txt");
while (true)
{
int size = sourceFile.read(buffer); // Read data from a file into a buffer
destFile.write(buffer, 0, size); // Write data from the buffer to a file
// Stop copying if the buffer is not full
if (size < buffer.length) break;
}
sourceFile.close();
destFile.close();
3. Tipos reales
Los tipos primitivos incluyen dos tipos para números reales. Aunque no es del todo exacto usar ese término. Cuando las computadoras manejan números reales, los llamamos números de punto flotante . El nombre proviene de un estándar para representar números, en el que las partes enteras y fraccionarias de un número están separadas por un punto (un punto, no una coma).
Cada país tiene sus propios estándares para escribir números (¡sorpresa!).
Muchas personas están acostumbradas a usar puntos para separar miles y comas como separador decimal: por ejemplo, escribirían one million ones and 153 thousandths
como 1.000.000,153
. Pero en los Estados Unidos, donde vivían los creadores de Java, se adoptó un estándar diferente:1000000.153
Java tiene dos tipos primitivos de coma flotante: double
y float
.
Como dijimos anteriormente, estos tipos tienen una disposición interna muy específica: de hecho, dentro de cada variable de estos tipos no hay un número, sino dos:
Por ejemplo, el número de punto flotante 987654.321
se puede representar como . Luego, en la memoria, se representará como dos números (la mantisa , es decir, la parte significativa del número) y ( el exponente , es decir, una potencia de diez)0.987654321*106
987654321
6
float
tipo
El nombre del float
tipo proviene de número de coma flotante . El tamaño de este tipo es bastante pequeño, solo 4 bytes (32 bits), pero puede almacenar valores desde hasta . Se asignan 24 bits para representar la mantisa y 8 bits para el exponente. Este tipo es capaz de almacenar solo 8 dígitos significativos.-3.4*1038
3.4*1038
Este enfoque hace posible almacenar números mucho más grandes que un int
, mientras usa los mismos 4 bytes. Pero para hacerlo, sacrificamos la precisión. Debido a que parte de la memoria almacena la mantisa, estas variables almacenan solo 6-7 lugares decimales mientras que el resto se descarta.
Ejemplo:
Código | Valor |
---|---|
|
123.45679 |
|
12346.0 |
|
-1.2345679 |
Como puede ver, el principal inconveniente de este tipo es el número muy pequeño de dígitos significativos y la pérdida de precisión a partir del octavo dígito. Es por eso que el float
tipo no es muy popular entre los programadores de Java.
double
tipo
El double
tipo es el tipo de punto flotante estándar. El nombre proviene del número de punto flotante de doble precisión . Todos los literales reales son double
s por defecto.
Este tipo ocupa 8 bytes de memoria (64 bits) y puede almacenar valores desde hasta . Una cosa importante que debe saber es que se asignan 53 bits para la mantisa, mientras que los 11 restantes son para el exponente.-1.7*10308
1.7*10308
Esto permite almacenar de 15 a 17 dígitos significativos.
Ejemplo:
Código | Valor |
---|---|
|
1234567890.1234567 |
|
1234567890.1234512 |
|
1234567890.1357913 |
Esta precisión, especialmente en comparación con el float
tipo, es decisiva: el 99% de todas las operaciones con números reales se realizan utilizando el double
tipo.
11
los bits se asignan para el exponente, lo que significa que puede almacenar potencias de diez de -323
a +308
(eso es una potencia de dos de -1024
a +1023
). El double
tipo puede almacenar fácilmente un número con cientos de ceros después del punto decimal:
Código | Valor |
---|---|
|
600.0 |
4. infinito
Los números de punto flotante tienen otra característica interesante: pueden almacenar un valor especial que denota infinito . Y puedes representar el infinito positivo y el infinito negativo .
Ejemplos:
Código | Nota |
---|---|
|
|
|
|
|
|
Si infinito se multiplica por un número, se obtiene infinito. Si sumas un número a infinito, obtienes infinito. Eso es muy conveniente.
No es un número ( NaN
)
Cualquier operación que involucre infinito produce infinito. Bueno, la mayoría pero no todos.
Los números de coma flotante pueden almacenar otro valor especial: NaN
. Es la abreviatura de N ot a N úmero (no es un número).
En matemáticas, si divides infinito por infinito, el resultado es indefinido.
Pero, en Java, si divides infinito por infinito, el resultado es NaN
.
Ejemplos:
Código | Nota |
---|---|
|
|
|
|
|
|
Cualquier operación con NaN
rendimientos NaN
.
5. char
tipo
Entre los tipos primitivos de Javachar
, uno merece una atención especial: el tipo. Su nombre proviene de la palabra carácter , y el tipo en sí se usa para almacenar caracteres.
Los caracteres son de lo que están hechas las cadenas, ¿verdad? Las cadenas son una matriz de caracteres.
¡Pero aún más interesante es el hecho de que el char
tipo también es un tipo numérico ! Es un tipo de doble propósito, por así decirlo.
La realidad es que el char
tipo en realidad no tiene personajes. En su lugar, almacena códigos de caracteres de la codificación Unicode. Cada carácter corresponde a un número: el código numérico del carácter.
Cada char
variable ocupa dos bytes en memoria (lo mismo que el short
tipo). Pero a diferencia del short
tipo, el char
tipo entero no tiene signo y puede almacenar valores desde 0
hasta 65,535
.
El char
tipo es un tipo híbrido. Sus valores se pueden interpretar como números (por ejemplo, se pueden sumar y multiplicar) y como caracteres. Esto se hizo porque si bien los caracteres son representaciones visuales, para una computadora son ante todo números. Y es mucho más conveniente trabajar con ellos como números.
Unicode
Unicode es una tabla especial (codificación) que contiene todos los caracteres del mundo. Y cada personaje tiene su propio número. Se ve aproximadamente así:
Hay diferentes formas de asignar un valor a una char
variable.
Código | Descripción |
---|---|
|
La a variable contendrá la letra latina A . |
|
La a variable contendrá la letra latina A . Su código es 65 . |
|
La a variable contendrá la letra latina A . Su código es 65 , que equivale 41 en sistema hexadecimal. |
|
La a variable contendrá la letra latina A . Su código es 65 , que equivale 41 en sistema hexadecimal. Los dos ceros extra no cambian nada. |
|
La a variable contendrá la letra latina A . Otra forma de definir un personaje por su código. |
La mayoría de las veces, las personas simplemente indican el carácter entre comillas (como en la primera fila de la tabla). Dicho esto, el último método también es popular. Su ventaja es que se puede utilizar en cadenas.
Y como dijimos, el char
tipo también es un tipo entero, por lo que puedes escribir algo como esto:
Código | Salida de consola |
---|---|
|
La letra latina B se mostrará en la pantalla. Porque: A – 65 B – 66 C –67 |
Trabajando con char
s
Cada uno char
es en primer lugar un número (código de carácter), y luego un carácter. Si conoce un código de carácter, siempre puede obtener el carácter en su programa. Ejemplo:
Código | Salida de consola |
---|---|
|
|
Códigos estándar
Estos son los códigos de caracteres más conocidos:
Caracteres | Códigos |
---|---|
0 , 1 , 2 , ...9 |
48 , 49 , 50 , ...57 |
a , b , c , ...z |
97 , 98 , 99 , ...122 |
A , B , C , ...Z |
65 , 66 , 67 , ...90 |
6. boolean
tipo
Y el último tipo primitivo es boolean
.
Como ya sabes, solo puede tomar dos valores: true
y false
.
Y con eso, ya sabes todo lo que hay que saber sobre este tipo.
GO TO FULL VERSION