HOWTO · Java
Diferença entre os tipos primitivos long e int em Java
Este artigo explica a diferença entre os tipos de dados long e int em Java
Nesta página
Use int quando os valores esperados pelo programa couberem em seu intervalo; escolha long quando puderem ser maiores. Ambos são tipos primitivos inteiros com sinal. Suas classes wrapper, Integer e Long, são objetos usados por APIs e coleções que trabalham com tipos de referência. As seções a seguir comparam seus intervalos, a sintaxe dos literais e as situações em que uma classe wrapper é útil.
Como escolher entre int e long em Java
Um int tem 32 bits e representa valores de -2,147,483,648 a 2,147,483,647. Um long tem 64 bits e representa valores de -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807. Decida com base no intervalo esperado para seus dados; o nome do tipo, por si só, não garante que todo resultado de uma operação aritmética caiba nele.
| Tipo | Largura | Mínimo | Máximo |
|---|---|---|---|
int |
32 bits | -2,147,483,648 | 2,147,483,647 |
long |
64 bits | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
Um literal inteiro decimal sem sufixo normalmente é do tipo int quando seu valor cabe nesse tipo. Acrescente L para indicar que um literal é long, especialmente quando seu valor excede o intervalo de int. Prefira o L maiúsculo, que é mais fácil de distinguir do algarismo 1. Por exemplo, long population = 9_000_000_000L; usa um literal long válido. Os sublinhados facilitam a leitura e não alteram o valor.
Execute este exemplo para comparar um valor int com um valor long:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
public class IntVsLongExample {
public static void main(String[] args) {
int count = 120;
long total = 9_000_000_000L;
System.out.println("count: " + count);
System.out.println("total: " + total);
}
}
Os rótulos visíveis no exemplo permanecem em inglês porque o bloco foi mantido sem alterações.
count: 120
total: 9000000000
Para comparar erros de compilação, int tooLarge = 2147483648; não compila: esse literal decimal não cabe em int e não tem o sufixo que o indicaria como long. Em vez disso, escreva long value = 2147483648L;. O compilador rejeita a primeira declaração antes da execução do programa, portanto ela não produz saída durante a execução. Lembre-se também de que uma expressão int é avaliada como int, a menos que um operando ou uma conversão faça a operação aritmética ser long; atribuir a long um resultado que já sofreu overflow não recupera o valor perdido.
Como usar as classes wrapper Integer e Long
Integer encapsula um int, e Long encapsula um long. O Java pode converter um primitivo em sua classe wrapper e vice-versa por meio de autoboxing e unboxing. Por exemplo, Integer score = 42; encapsula o valor primitivo, enquanto int recordedScore = score; extrai o valor primitivo. Os métodos explícitos intValue() e longValue() também estão disponíveis quando deixar a conversão visível melhora a legibilidade.
As classes wrapper são úteis quando uma API exige objetos. Por exemplo, coleções genéricas como List<Integer> não aceitam um tipo primitivo como argumento de tipo, então os valores adicionados a essa lista são encapsulados. Escolha Long para representar um long como objeto, por exemplo em List<Long>. Para operações aritméticas locais comuns, os tipos primitivos geralmente são mais simples; as classes wrapper não são necessárias apenas para chamar um método de conversão ou utilitário.
O intervalo do valor encapsulado permanece o mesmo: um Integer armazena um valor int, e um Long armazena um valor long. Uma classe wrapper não permite representar um número maior do que o tipo primitivo correspondente comporta. Use L em um literal long tanto ao atribuí-lo a uma variável long quanto ao encapsulá-lo em um Long.
Como os tipos primitivos diferem dos objetos wrapper
Uma variável primitiva armazena um valor de seu tipo primitivo. Uma variável wrapper contém uma referência a um objeto wrapper ou null. Essa é a distinção útil para programar; descrever wrappers simplesmente como ponteiros para o armazenamento numérico é um modelo físico de memória impreciso e não ajuda na escolha do tipo.
Primitivos não podem ser null. Uma referência como Integer optionalCount = null; pode representar a ausência de um valor, o que é útil quando uma API ou um modelo de dados precisa distinguir “não informado” do número zero. Nesse caso, é necessário verificar se o valor é null antes de usá-lo. Se o Java tentar fazer unboxing de um Integer ou Long nulo, a operação lançará NullPointerException; só faça unboxing depois de confirmar que a referência contém um objeto.
Em resumo, escolha int ou long de acordo com o intervalo numérico necessário e use Integer ou Long quando APIs baseadas em objetos, coleções ou valores que podem ser nulos exigirem wrappers. Assim, tanto as operações aritméticas quanto a representação de dados ausentes ficam explícitas.