1. Lista de tipos primitivos

Java tem 8 tipos primitivos básicos. Eles são chamados de primitivos porque os valores desses tipos não são objetos e são armazenados diretamente dentro de variáveis.

Aqui está uma tabela com algumas informações breves sobre esses tipos:

Tipo Tamanho
em bytes
Faixa de valor Valor padrão Descrição
byte 1 -128 .. 127 0 O menor tipo inteiro é um único byte
short 2 -32.768 .. 32.767 0 Inteiro curto, dois bytes
int 4 -2*10 9 .. 2*10 9 0 Número inteiro, 4 bytes
long 8 -9*10 18 .. 9*10 18 0L Inteiro longo, 8 bytes
float 4 -10 38 .. 10 38 0.0f Número de ponto flutuante, 4 bytes
double 8 -10 308 .. 10 308 0.0d Número de ponto flutuante de precisão dupla, 8 bytes
boolean 1 true,false false Tipo booleano (somente truee false)
char 2 0 .. 65.535 '\u0000' Caracteres, 2 bytes, todos maiores que 0
Valor padrão

A propósito, aqui está uma nuance importante. Se você declarar uma variável de instância (campo) ou uma variável de classe estática e não atribuir imediatamente nenhum valor a ela, ela será inicializada com um valor padrão . A tabela apresenta uma lista desses valores.

As variáveis ​​locais em um método não têm valor padrão. Se você não atribuir um valor a essas variáveis, elas serão consideradas não inicializadas e não poderão ser usadas.

Mas vamos voltar aos tipos primitivos e dar uma olhada neles.



2. Tipos inteiros

Java tem 4 tipos inteiros : byte, shorte int. longEles diferem em seu tamanho e no intervalo de valores que podem armazenar.

inttipo

O mais comumente usado é o inttipo. O nome vem da palavra int eger (número inteiro). Todos os literais inteiros (números inteiros) no código são ints(se não terminarem em L, Fou D).

Variáveis ​​desse tipo podem assumir valores de -2,147,483,648a +2,147,483,647.

Isso é muito e é suficiente para quase todas as ocasiões. Quase toda função que retorna um número retorna um int.

Exemplos:

Código Explicação
int n = "String".length();
O length()método retorna o comprimento de uma string
String[] array = {"Tic", "Tac", "Toe"};
int n = array.length;
O lengthcampo contém o comprimento da matriz.

shorttipo

O shorttipo recebe seu nome de short int. Também é freqüentemente chamado de inteiro curto . Ao contrário do inttipo, seu comprimento é de apenas dois bytes e o intervalo de valores possíveis é de -32,768a +32,767.

Isso significa que você não pode armazenar o número um milhão nele. Ou até 50.000. Este é o tipo inteiro mais raramente usado em Java. A principal motivação para usá-lo é conservar a memória.

Suponha que você tenha uma situação em que sabe de antemão que estará trabalhando com valores que nunca excedem 30.000, e haverá milhões desses valores.

Por exemplo, digamos que você esteja escrevendo um aplicativo que processa imagens de ultra-alta definição que usam 10-bits por cor. E você tem um milhão de pixels em sua imagem. Este é um cenário em que a decisão de usar intou shorté importante.

longtipo

Esse tipo recebe seu nome long inte também é chamado de inteiro longo . Ao contrário do inttipo, ele possui uma gama de valores fabulosamente enorme: de a .-9*1018+9*1018

Por que não é o tipo inteiro básico?

Porque o Java apareceu em meados dos anos 90, quando a maioria dos computadores era de 32 bits. Isso significa que todos os processadores foram otimizados para trabalhar com números de 32 bits. Os processadores podiam trabalhar com números inteiros de 64 bits, mas as operações com eles eram mais lentas.

Como resultado, os programadores decidiram razoavelmente fazer into tipo inteiro padrão e usar o longtipo somente quando realmente necessário.

bytetipo

Este é o menor tipo inteiro em Java, mas está longe de ser o menos usado. Seu nome, byte, também é a palavra para o menor bloco endereçável de memória em Java.

Não há muitos valores válidos para o bytetipo: de -128a +127. Mas essa não é sua força. O bytetipo é usado com mais frequência quando você precisa armazenar um grande blob de dados na memória. Uma matriz de bytes é ideal para essa finalidade.

Suponha que você precise copiar um arquivo em algum lugar.

Você não precisa processar o conteúdo do arquivo: você só quer criar uma área de memória (buffer), copiar o conteúdo do arquivo para ele e, em seguida, gravar os dados do buffer em outro arquivo. Uma bytematriz é o que você precisa para isso.

Lembre-se de que uma variável de array armazena apenas uma referência a uma área da memória. Quando a variável é passada para algum método, apenas o endereço de memória é passado. O próprio bloco de memória não é copiado.

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 reais

Os tipos primitivos incluem dois tipos para números reais. Embora não seja totalmente correto usar esse termo. Quando os computadores lidam com números reais, nós os chamamos de números de ponto flutuante . O nome vem de um padrão de representação de números, no qual as partes inteira e fracionária de um número são separadas por um ponto (um ponto, não uma vírgula).

Algumas informações úteis:

Cada país tem seus próprios padrões para escrever números (surpresa!).

Muitas pessoas estão acostumadas a usar pontos para separar milhares e vírgulas como separador decimal: por exemplo, eles escreveriam one million ones and 153 thousandthscomo 1.000.000,153. Mas nos Estados Unidos, onde moravam os criadores do Java, um padrão diferente foi adotado:1000000.153

Java tem dois tipos primitivos de ponto flutuante: doublee float.

Como dissemos anteriormente, esses tipos possuem um arranjo interno muito específico: na verdade, dentro de cada variável desses tipos não há um número, mas dois:

Por exemplo, o número de ponto flutuante 987654.321pode ser representado como . Então, na memória, será representado como dois números (a mantissa , ou seja, a parte significativa do número) e ( expoente , ou seja, uma potência de dez)0.987654321*1069876543216

floattipo

O nome do floattipo vem do número de ponto flutuante . O tamanho desse tipo é bem pequeno — apenas 4 bytes (32 bits) — mas pode armazenar valores de a . 24 bits são alocados para representar a mantissa e 8 bits para o expoente. Este tipo é capaz de armazenar apenas 8 dígitos significativos.-3.4*10383.4*1038

Essa abordagem possibilita armazenar números muito maiores do que um int, enquanto usa os mesmos 4 bytes. Mas, para fazer isso, sacrificamos a precisão. Como parte da memória armazena a mantissa, essas variáveis ​​armazenam apenas 6 a 7 casas decimais, enquanto o restante é descartado.

Exemplo:

Código Valor
float a = (float) 123.456789;
123.45679
float a = (float) 12345.9999;
12346.0
float a = (float) -123.456789E-2;
-1.2345679

Como você pode ver, a principal desvantagem desse tipo é o número muito pequeno de dígitos significativos e a perda de precisão logo no oitavo dígito. É por isso que o floattipo não é muito popular entre os programadores Java.

doubletipo

O doubletipo é o tipo de ponto flutuante padrão. O nome vem de número de ponto flutuante de precisão dupla . Todos os literais reais são doubles por padrão.

Este tipo ocupa 8 bytes de memória (64 bits) e pode armazenar valores de a . Uma coisa importante a saber é que 53 bits são alocados para a mantissa, enquanto os 11 restantes são para o expoente.-1.7*103081.7*10308

Isso permite que 15-17 dígitos significativos sejam armazenados.

Exemplo:

Código Valor
double a = 1234567890.1234567890;
1234567890.1234567
double a = 1234567890.1234512345;
1234567890.1234512
double a = 1234567890.1357913579;
1234567890.1357913

Essa precisão, principalmente na comparação com o floattipo, é decisiva: 99% de todas as operações com números reais são realizadas usando o doubletipo.

11os bits são alocados para o expoente, o que significa que você pode armazenar potências de dez de -323a +308(que é uma potência de dois de -1024a +1023). O doubletipo pode armazenar facilmente um número com centenas de zeros após o ponto decimal:

Código Valor
double a = 2E-300 * 3E+302
600.0


4. Infinito

Os números de ponto flutuante têm outra característica interessante: eles podem armazenar um valor especial que denota infinito . E você pode representar infinito positivo e infinito negativo .

Exemplos:

Código Observação
System.out.println( 100.0 / 0.0 );
Infinity
System.out.println( -100.0 / 0.0 );
-Infinity
double a = 1d / 0d;
double b = a * 10;
double c = b - 100;
a == Infinity
b == Infinity
c == Infinity

Se infinito for multiplicado por um número, você obtém infinito. Se você adicionar um número ao infinito, obterá o infinito. Isso é super conveniente.

Não é um número ( NaN)

Quaisquer operações envolvendo infinito produzem infinito. Bem, a maioria, mas não todos.

Números de ponto flutuante podem armazenar outro valor especial: NaN. É a abreviação de N ot a Number (não é um número) .

Em matemática, se você dividir infinito por infinito, o resultado é indefinido.

Mas, em Java, se você dividir infinito por infinito, o resultado será NaN.

Exemplos:

Código Observação
System.out.println(0.0 / 0.0);
NaN
double infinity = 1d / 0d;
System.out.println(infinity / infinity);

NaN
double a = 0.0 / 0.0;
double b = a * 10;
double c = b - 100;
double d = a + infinity;
a == NaN
b == NaN
c == NaN
d == NaN

Qualquer operação com NaNrendimentos NaN.



5. chardigite

Dentre os tipos primitivos de Java , um merece atenção especial: o chartipo. Seu nome vem da palavra char acter , e o próprio tipo é usado para armazenar caracteres.

Os caracteres são do que as strings são feitas, certo? Strings são uma matriz de caracteres.

Mas ainda mais interessante é o fato de que o chartipo também é um tipo numérico ! É um tipo de dupla finalidade, por assim dizer.

A realidade é que o chartipo não é realmente personagens. Em vez disso, ele armazena códigos de caracteres da codificação Unicode. Cada caractere corresponde a um número: o código numérico do caractere.

Cada charvariável ocupa dois bytes na memória (igual ao shorttipo). Mas, ao contrário do shorttipo, o chartipo inteiro não tem sinal e pode armazenar valores de 0a 65,535.

O chartipo é um tipo híbrido. Seus valores podem ser interpretados tanto como números (por exemplo, podem ser somados e multiplicados) quanto como caracteres. Isso foi feito porque, embora os personagens sejam representações visuais, para um computador eles são, acima de tudo, apenas números. E é muito mais conveniente trabalhar com eles como números.

Unicode

Unicode é uma tabela especial (codificação) que contém todos os caracteres do mundo. E cada personagem tem seu próprio número. Parece mais ou menos assim:

Tipos primitivos em Java

Existem diferentes maneiras de atribuir um valor a uma charvariável.

Código Descrição
char a = 'A';
A avariável conterá a letra latina A.
char a = 65;
A avariável conterá a letra latina A. Seu código é 65.
char a = 0x41;
A avariável conterá a letra latina A.
Seu código é 65, que equivale 41no sistema hexadecimal.
char a = 0x0041;
A avariável conterá a letra latina A.
Seu código é 65, que equivale 41no sistema hexadecimal.
Os dois zeros extras não mudam nada.
char a = '\u0041';
A avariável conterá a letra latina A.
Outra maneira de definir um caractere por seu código.

Na maioria das vezes, as pessoas simplesmente indicam o caractere entre aspas (como na primeira linha da tabela). Dito isto, o último método também é popular. Sua vantagem é que pode ser usado em strings.

E como dissemos, o chartipo também é um tipo inteiro, então você pode escrever algo assim:

Código Saída do console
char a = 'A';
a++;
System.out.println(a);
A letra latina Bserá exibida na tela.
Porque:
A65
B66
C67

Trabalhando com chars

Cada um charé antes de tudo um número (código de caractere) e depois um caractere. Se você conhece um código de caractere, sempre pode obter o caractere em seu programa. Exemplo:

Código Saída do console
char c = (char) 1128;
System.out.println(c);

Ѩ

códigos padrão

Aqui estão os códigos de caracteres mais conhecidos:

Personagens 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. booleantipo

E o último tipo primitivo é boolean.

Como você já sabe, só pode assumir dois valores: truee false.

E com isso você já sabe tudo o que há para saber sobre esse tipo.