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 true e false ) |
char |
2 | 0 .. 65.535 | '\u0000' |
Caracteres, 2 bytes, todos maiores que 0 |
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
, short
e int
. long
Eles diferem em seu tamanho e no intervalo de valores que podem armazenar.
int
tipo
O mais comumente usado é o int
tipo. 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
, F
ou D
).
Variáveis desse tipo podem assumir valores de -2,147,483,648
a +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 |
---|---|
|
O length() método retorna o comprimento de uma string |
|
O length campo contém o comprimento da matriz. |
short
tipo
O short
tipo recebe seu nome de short int
. Também é freqüentemente chamado de inteiro curto . Ao contrário do int
tipo, seu comprimento é de apenas dois bytes e o intervalo de valores possíveis é de -32,768
a +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 int
ou short
é importante.
long
tipo
Esse tipo recebe seu nome long int
e também é chamado de inteiro longo . Ao contrário do int
tipo, 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 int
o tipo inteiro padrão e usar o long
tipo somente quando realmente necessário.
byte
tipo
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 byte
tipo: de -128
a +127
. Mas essa não é sua força. O byte
tipo é usado com mais frequência quando você precisa armazenar um grande blob de dados na memória. Uma matriz de byte
s é 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 byte
matriz é 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).
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 thousandths
como 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: double
e 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.321
pode 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*106
987654321
6
float
tipo
O nome do float
tipo 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*1038
3.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 |
---|---|
|
123.45679 |
|
12346.0 |
|
-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 float
tipo não é muito popular entre os programadores Java.
double
tipo
O double
tipo é 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 double
s 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*10308
1.7*10308
Isso permite que 15-17 dígitos significativos sejam armazenados.
Exemplo:
Código | Valor |
---|---|
|
1234567890.1234567 |
|
1234567890.1234512 |
|
1234567890.1357913 |
Essa precisão, principalmente na comparação com o float
tipo, é decisiva: 99% de todas as operações com números reais são realizadas usando o double
tipo.
11
os bits são alocados para o expoente, o que significa que você pode armazenar potências de dez de -323
a +308
(que é uma potência de dois de -1024
a +1023
). O double
tipo pode armazenar facilmente um número com centenas de zeros após o ponto decimal:
Código | Valor |
---|---|
|
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 |
---|---|
|
|
|
|
|
|
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 |
---|---|
|
|
|
|
|
|
Qualquer operação com NaN
rendimentos NaN
.
5. char
digite
Dentre os tipos primitivos de Java , um merece atenção especial: o char
tipo. 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 char
tipo também é um tipo numérico ! É um tipo de dupla finalidade, por assim dizer.
A realidade é que o char
tipo 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 char
variável ocupa dois bytes na memória (igual ao short
tipo). Mas, ao contrário do short
tipo, o char
tipo inteiro não tem sinal e pode armazenar valores de 0
a 65,535
.
O char
tipo é 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:
Existem diferentes maneiras de atribuir um valor a uma char
variável.
Código | Descrição |
---|---|
|
A a variável conterá a letra latina A . |
|
A a variável conterá a letra latina A . Seu código é 65 . |
|
A a variável conterá a letra latina A . Seu código é 65 , que equivale 41 no sistema hexadecimal. |
|
A a variável conterá a letra latina A . Seu código é 65 , que equivale 41 no sistema hexadecimal. Os dois zeros extras não mudam nada. |
|
A a variá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 char
tipo também é um tipo inteiro, então você pode escrever algo assim:
Código | Saída do console |
---|---|
|
A letra latina B será exibida na tela. Porque: A – 65 B – 66 C –67 |
Trabalhando com char
s
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 |
---|---|
|
|
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. boolean
tipo
E o último tipo primitivo é boolean
.
Como você já sabe, só pode assumir dois valores: true
e false
.
E com isso você já sabe tudo o que há para saber sobre esse tipo.
GO TO FULL VERSION