Long vs Inteiro, long vs int, o que usar e quando?

135

Às vezes, vejo APIs usando long or Longou intor Integere não consigo entender como a decisão é tomada para isso?

Quando devo escolher o que?

Eu sei como marcar o V
fonte

Respostas:

191

Longé a Objectforma de longe Integeré a forma de objeto de int.

O longusa 64 bits . Ele intusa 32 bits e, portanto, pode armazenar apenas números de até ± 2 bilhões (-2 31 a +2 31 -1).

Você deve usar longe int, exceto onde você precisar fazer uso de métodos herdados Object, como hashcode. Java.util.collectionsOs métodos geralmente usam as Objectversões in a box ( -wrapped), porque precisam funcionar para qualquer um Object, e um tipo primitivo, como intou long, não é umObject .

Outra diferença é que longe intestão de passagem por valor , enquanto Longe Integersão pass-by-referência de valor , como todos os tipos não-primitivos Java. Portanto, se fosse possível modificar um Longou Integer(não é, eles são imutáveis ​​sem usar o código JNI), haveria outro motivo para usar um sobre o outro.

Uma diferença final é que um Longou Integerpoderia ser null.

Borealid
fonte
5
@ Borealid, isso é tão errado, Java sempre passa por valor, não há nada como passar por referência em Java.
Diego Ramos
9
Uh huh? Ok, vamos explorar a ideia de que o Java nunca passa uma referência. Se eu chamar uma função fornecendo um int [2] e, dentro da função, alterar o valor mantido no primeiro elemento dessa matriz, o chamador da função verá essa alteração? Sim? Bem, isso porque o que foi passado para a função não foram os valores na matriz, mas uma referência a esses valores. "Passar por valor" significa que os próprios dados reais estão sendo copiados sem indireção. Quem ensinou a você que Java era uma passagem por valor, fez um desserviço.
Borealid 04/07/19
3
@Borealid você está incorreto, o valor é alterado porque uma nova cópia da referência à matriz foi criada, é por isso que quem está chamando a função verá a alteração, isso ainda passará por valor. Não acredito que você diz que existe uma referência por referência em Java. Você nunca passa a referência original para a função.
Diego Ramos
6
Em um mundo teórico em que o Java se comportou de maneira completamente diferente do que realmente faz, e passar um objeto ou matriz para uma função resultou em uma cópia totalmente separada (onde as modificações na função não eram refletidas para os chamadores), como você descrever o idioma? Tendo em mente que o que estamos falando não é completamente o que o Java realmente faz.
Borealid 5/07
2
@DiegoRamos está certo. Java é sempre transmitido por valor, a confusão é criada porque o valor quando não primitivo é uma referência de memória, a troca estática não funciona em java, mais detalhes aqui: journaldev.com/3884/…
Panthro
28

Há algumas coisas que você não pode fazer com um tipo primitivo:

  • Tenha um nullvalor
  • sincronizar com eles
  • Use-os como parâmetro de tipo para uma classe genérica e relacionados a isso:
  • Passe-os para uma API que funciona com Objects

A menos que você precise de um desses, você deve preferir tipos primitivos, pois eles exigem menos memória.

Michael Borgwardt
fonte
24
  • Por padrão, use um int, ao manter números.
  • Se o alcance de intfor muito pequeno, use umlong
  • Se o alcance de longfor muito pequeno, useBigInteger
  • Se você precisar manipular seus números como objeto (por exemplo, ao colocá-los em Collection, manipulação null, ...) use Integer/ em Longvez disso
Joachim Sauer
fonte
13

An inté um número inteiro de 32 bits; a longé um número inteiro de 64 bits. Qual deles usar depende do tamanho dos números com os quais você espera trabalhar.

inte longsão tipos primitivos, enquanto Integere Longsão objetos. Tipos primitivos são mais eficientes, mas às vezes você precisa usar objetos; por exemplo, as classes de coleção do Java podem funcionar apenas com objetos; portanto, se você precisar de uma lista de números inteiros, precisará transformá-la em List<Integer>, por exemplo (você não pode usá int-la Listdiretamente).

Jesper
fonte
6

Inteiro é um tipo inteiro assinado de 32 bits

  • Denotado como Int
  • Size = 32 bits (4byte)
  • Pode conter números inteiros de intervalo -2,147,483,648 to 2,147,483,647
  • o valor padrão é 0


Long é um tipo inteiro assinado de 64 bits

  • Denotado como Long
  • Size = 64 bits (8byte)
  • Pode conter números inteiros de intervalo -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • o valor padrão é 0L


Se o uso de uma variável estiver no intervalo de 32 bits, use Int, caso contrário, use long. Geralmente longo é usado para cálculos científicos e coisas assim precisam de muita precisão. (por exemplo, valor de pi).

Um exemplo de escolha de um sobre o outro é o caso do YouTube. Primeiro, eles definiram o contador de visualizações de vídeo como intexcedente quando mais de 2.147.483.647 visualizações foram recebidas em um vídeo popular. Como um Intcontador não pode armazenar nenhum valor além do seu intervalo, o YouTube alterou o contador para uma variável de 64 bits e agora pode contar até 9.223.372.036.854.775,807 visualizações. Entenda seus dados e escolha o tipo que se ajusta à variável de 64 bits, que consumirá o dobro da memória do que uma variável de 32 bits.

Tudo é muito
fonte
1

Quando se trata de usar um número muito longo que pode exceder 32 bits para representar, você pode usar muito tempo para garantir que não tenha um comportamento estranho.

No Java 5, você pode usar os recursos de entrada e saída para tornar o uso de int e Inteiro completamente o mesmo. Isso significa que você pode fazer:

int myInt = new Integer(11);
Integer myInt2 = myInt;

O dentro e fora do boxe permitem alternar entre int e Integer sem qualquer conversão adicional (o mesmo para Long, Double, Shorttambém)

Você pode usar into tempo todo, mas Integercontém alguns métodos auxiliares que podem ajudá-lo a executar algumas operações complexas com números inteiros (como Integer.parseInt(String))

Houcem Berrayana
fonte
0

a) classe de objeto "Long" versus tipo primitivo "long". (Pelo menos em Java)

b) Existem tamanhos de memória diferentes (até pouco claros) dos tipos primitivos:

Java - tudo limpo: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • byte, caractere .. 1B .. 8b
  • int curto .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • longo int .. 8B .. 64b

C .. apenas bagunça: https://en.wikipedia.org/wiki/C_data_types

  • curto .. 16b
  • int .. 16b ... wtf?!?!
  • longo .. 32b
  • muito tempo .. 64b .. bagunça! : - /
Franta
fonte
Isso não responder à pergunta, que é sobre a diferença entre Long e longo etc.
GreenAsJade
Não, ele não responde explicitamente, nem diz explicitamente a diferença entre tipos primitivos x objetos de tipo de dados, na verdade @GreenAsJade, porque a pergunta aqui acima não indica nenhum idioma específico. Então, eu forneci uma comparação - para que todos possam verificar a diferença. (a partir dos dados
físicos
A pergunta dizia Java.
GreenAsJade