Olá! Ao passar pelo JavaRush, você encontrou tipos primitivos mais de uma vez. Aqui está uma pequena lista do que sabemos sobre eles:
Mas, além dos valores, os tipos também diferem no tamanho da memória.
O tipo
- Eles não são objetos e representam um valor armazenado na memória
- Existem vários tipos de tipos primitivos:
- Números inteiros -
byte
,short
,int
,long
- Números de ponto flutuante (fracionários) -
float
edouble
- Boleano -
boolean
- Simbólico (para indicar letras e números) -
char
- Números inteiros -
- Cada um deles tem sua própria faixa de valores:
Tipo primitivo | Tamanho na memória | Faixa de valores |
---|---|---|
byte | 8 bits | -128 a 127 |
curto | 16 bits | para -32768 a 32767 |
Caracteres | 16 bits | de 0 a 65536 |
interno | 32 bits | de -2147483648 a 2147483647 |
longo | 64 bits | de -9223372036854775808 a 9223372036854775807 |
flutuador | 32 bits | de (2 elevado a -149) a ((2-2 elevado a -23)*2 elevado a 127) |
dobro | 64 bits | de (-2 elevado a 63) a ((2 elevado a 63) - 1) |
boleano | 8 (quando usado em arrays), 32 (quando usado em não arrays) | verdadeiro ou falso |
int
leva mais que byte
. A long
- mais que short
. A quantidade de memória ocupada pelos primitivos pode ser comparada à das bonecas aninhadas: há espaço livre dentro da boneca aninhada. Quanto maior a boneca, mais espaço. long
Podemos facilmente colocar um menor dentro de uma boneca grande int
. Cabe facilmente e você não precisa fazer nada extra. Em Java, ao trabalhar com primitivos, isso é chamado de conversão automática. De outra forma, é chamado de extensão. Aqui está um exemplo de extensão simples:
public class Main {
public static void main(String[] args) {
int bigNumber = 10000000;
byte littleNumber = 16;
bigNumber = littleNumber;
System.out.println(bigNumber);
}
}
Aqui atribuímos um valor byte
a uma variável int
. A atribuição foi realizada com sucesso e sem problemas: o valor armazenado em byte
ocupa menos espaço de memória do que “cabe” em int
. “Pequena boneca” (valor byte
) cabe facilmente na “grande matryoshka” (variável int
). É outra questão quando você tenta fazer o oposto - colocar um valor grande em uma variável que não foi projetada para tais tamanhos. Em princípio, esse truque não funcionará com bonecos reais, mas em Java funcionará, mas com nuances. Vamos tentar colocar um valor int
em uma variável short
:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = bigNumber;//error!
System.out.println(bigNumber);
}
Erro! O compilador entende que você está tentando fazer algo fora do padrão e coloca uma boneca matryoshka grande ( int
) dentro de uma pequena ( short
). Um erro de compilação neste caso é um aviso do compilador: “ Ei, tem certeza que deseja fazer isso? “Se você tiver certeza, informe o compilador: “ Está tudo bem, eu sei o que estou fazendo!” ”Esse processo é chamado de conversão explícita de tipo ou estreitamento . Para fazer um estreitamento, você precisa indicar explicitamente o tipo para o qual deseja converter seu valor. Em outras palavras, responda à pergunta do compilador: “ Bem, em qual desses bonequinhos você quer colocar esse boneco grande?” ”No nosso caso, será assim:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = (short) bigNumber;
System.out.println(littleNumber);
}
Indicamos explicitamente que queremos ajustar o valor int
em uma variável short
e assumir a responsabilidade por isso. O compilador, vendo uma indicação explícita de um tipo mais restrito, executa uma conversão. Qual será o resultado? Saída do console: -27008 Um pouco inesperado. Por que exatamente assim? Na verdade é simples. Tínhamos o valor original - 10000000 Ele foi armazenado em uma variável int
que ocupava 32 bits, e na forma binária ficou assim: Escrevemos esse valor na variável short
, mas ela só pode armazenar 16 bits! Conseqüentemente, apenas os primeiros 16 bits do nosso número serão movidos para lá, o restante será descartado. Como resultado, a variável short
conterá o valor , que na forma decimal é exatamente igual a -27008. É por isso que o compilador “pediu confirmação” na forma de uma conversão explícita para um tipo específico. Em primeiro lugar, mostra que você assume a responsabilidade pelo resultado e, em segundo lugar, informa ao compilador quanto espaço deve ser alocado ao converter tipos. Afinal, se no último exemplo tivéssemos convertido int
para type byte
, e não para short
, teríamos apenas 8 bits à nossa disposição, e não 16, e o resultado teria sido diferente. Para tipos fracionários ( float
e double
), o estreitamento ocorre de maneira diferente. Se você tentar converter tal número para um tipo inteiro, sua parte fracionária será descartada.
public static void main(String[] args) {
double d = 2.7;
long x = (int) d;
System.out.println(x);
}
Saída do console: 2
Tipo de dados char
Você já sabe que o tipo char é usado para exibir caracteres individuais.public static void main(String[] args) {
char c = '!';
char z = 'z';
char i = '8';
}
Mas tem vários recursos que são importantes de entender. Vejamos novamente a tabela com intervalos de valores:
Tipo primitivo | Tamanho na memória | Faixa de valores |
---|---|---|
byte | 8 bits | -128 a 127 |
curto | 16 bits | -32768 a 32767 |
Caracteres | 16 bits | de 0 a 65536 |
interno | 32 bits | de -2147483648 a 2147483647 |
longo | 64 bits | de -9223372036854775808 a 9223372036854775807 |
flutuador | 32 bits | de (2 elevado a -149) a ((2-2 elevado a -23)*2 elevado a 127) |
dobro | 64 bits | de (-2 elevado à potência de 63) a ((2 elevado à potência de 63) -1) |
boleano | 8 (quando usado em arrays), 32 (quando usado em não arrays) | verdadeiro ou falso |
char
possui um intervalo numérico de 0 a 65536. Mas o que isso significa? Afinal, char
não se trata apenas de números, mas também de letras, sinais de pontuação... O fato é que os valores char
são armazenados em Java no formato Unicode. Já encontramos o Unicode em uma das palestras anteriores. Você provavelmente se lembra que Unicode é um padrão de codificação de caracteres que inclui caracteres de quase todos os idiomas escritos do mundo. Em outras palavras, esta é uma lista de códigos especiais em que existe um código para quase todos os caracteres de qualquer idioma. A tabela Unicode geral é muito grande e, claro, não precisa ser memorizada. Aqui, por exemplo, está um trecho: O principal é entender o princípio de armazenamento de valores char
, e lembrar que conhecendo o código de um símbolo específico, você sempre pode obtê-lo no programa. Vamos tentar isso com algum número aleatório:
public static void main(String[] args) {
int x = 32816;
char c = (char) x ;
System.out.println(c);
}
Saída do console: Este é o formato no qual os caracteres são armazenados em Java char
. Cada caractere corresponde a um número – um código numérico de 16 bits ou dois bytes. Unicode 32816 corresponde ao caractere 耰. Preste atenção neste momento. Neste exemplo usamos a variável int
. Ocupa 32 bits de memória , enquanto char
16 . Aqui escolhemos porque o número que precisamos, 32816, está fora do intervalo . Embora o tamanho , assim como o curto, seja de 16 bits, não há números negativos no intervalo, portanto o intervalo “positivo” é duas vezes maior (65536 em vez de 32767 ). Podemos usar , desde que nosso código esteja dentro do intervalo 65536. Mas se criarmos um número , ele ocupará mais de 16 bits. E ao restringir os tipos: int
short
char
char
char
short
int
int >65536
char c = (char) x;
os bits extras serão descartados e o resultado será bastante inesperado.
Recursos de adição de caracteres e inteiros
Vejamos este exemplo incomum:public class Main {
public static void main(String[] args) {
char c = '1';
int i = 1;
System.out.println(i+c);
}
}
Saída do console: 50 O_O Onde está a lógica? 1+1, de onde veio 50?! Você já sabe que os valores char
são armazenados na memória como números no intervalo de 0 a 65536, representando o Unicode do nosso personagem. Então aqui está. Quando realizamos adição char
e algum tipo inteiro char
é convertido no número que lhe corresponde em Unicode. Quando em nosso código adicionamos 1 e '1', o símbolo '1' foi transformado em seu código, que é 49 (você pode conferir na tabela acima). Portanto, o resultado passou a ser igual a 50. Vamos mais uma vez pegar nosso velho amigo -耰como exemplo e tentar adicioná-lo com algum número.
public static void main(String[] args) {
char c = '耰';
int x = 200;
System.out.println(c + x);
}
Saída do console: 33016 Já descobrimos quecorresponde ao código 32816. E quando somamos este número e 200, obtemos exatamente o nosso resultado - 33016 :) O mecanismo de funcionamento, como você pode ver, é bastante simples.
GO TO FULL VERSION