Long vs Integer, long vs int, que faut-il utiliser et quand?


135

Parfois, je vois des API utiliser longou Longou intou Integer, et je ne peux pas comprendre comment la décision est prise pour cela?

Quand dois-je choisir quoi?

Réponses:


191

Longest la Objectforme longet Integerest la forme objet de int.

Le longutilise 64 bits . Le intutilise 32 bits et ne peut donc contenir que des nombres jusqu'à ± 2 milliards (-2 31 à +2 31 -1).

Vous devez utiliser longet int, sauf lorsque vous devez utiliser des méthodes héritées de Object, telles que hashcode. Java.util.collectionsLes méthodes utilisent généralement les Objectversions encadrées ( enveloppées), car elles doivent fonctionner pour tout Object, et un type primitif, comme intou long, n'est pas un Object.

Une autre différence est que longet intsont des valeurs pass-by-value , alors que Longet Integersont des valeurs pass-by-reference , comme tous les types Java non primitifs. Donc, s'il était possible de modifier un Longou Integer(ce n'est pas le cas, ils sont immuables sans utiliser de code JNI), il y aurait une autre raison d'utiliser l'un par rapport à l'autre.

Une dernière différence est que un Longou Integerpourrait être null.


5
@Borealid, c'est tellement faux, Java est toujours passé par valeur, il n'y a rien de tel que le passage par référence en Java.
Diego Ramos le

9
Euh hein? D'accord, explorons l'idée que Java ne passe jamais une référence. Si j'appelle une fonction en lui donnant un int [2], puis à l'intérieur de la fonction je change la valeur contenue dans le premier élément de ce tableau, l'appelant de la fonction verra-t-il ce changement? Oui? Eh bien, c'est parce que ce qui a été passé à la fonction n'était pas les valeurs du tableau, mais plutôt une référence à ces valeurs. «Passer par valeur» signifie que les données réelles elles-mêmes sont copiées sans indirection. Quiconque vous a appris que Java était pass-by-value ne vous a pas rendu service.
Borealid

3
@Borealid vous êtes incorrect, la valeur est modifiée car une nouvelle copie de la référence au tableau a été créée, c'est pourquoi celui qui appelle la fonction verra le changement, c'est toujours un passage par valeur. Je ne peux pas croire que vous disiez qu'il y a un passage par référence en Java. Vous ne transmettez jamais la référence d'origine à la fonction.
Diego Ramos

6
Dans un monde théorique où Java se comportait complètement différemment de ce qu'il fait réellement, et le passage d'un objet ou d'un tableau à une fonction aboutissait à une copie totalement séparée (où les modifications à l'intérieur de la fonction n'étaient pas du tout reflétées aux appelants), comment feriez-vous alors décrire la langue? Gardant à l'esprit que ce dont nous parlons n'est absolument pas ce que fait réellement Java.
Borealid

2
@DiegoRamos a raison. Java est toujours passe par valeur, la confusion est créée car la valeur quand non primitive est une référence mémoire, l'échange statique ne fonctionne pas en java, plus de détails ici: journaldev.com/3884/…
Panthro

28

Il y a quelques choses que vous ne pouvez pas faire avec un type primitif:

  • Avoir une nullvaleur
  • synchroniser sur eux
  • Utilisez-les comme paramètre de type pour une classe générique, et liés à cela:
  • Transmettez-les à une API qui fonctionne avec Objects

Sauf si vous en avez besoin, vous devriez préférer les types primitifs, car ils nécessitent moins de mémoire.


24
  • Par défaut, utilisez un int, lorsque vous détenez des nombres.
  • Si la plage de intest trop petite, utilisez unlong
  • Si la plage de longest trop petite, utilisezBigInteger
  • Si vous avez besoin de gérer vos nombres comme des objets (par exemple lors de leur mise en a Collection, manipulation null, ...), utilisez Integer/ à la Longplace

13

An intest un entier de 32 bits; a longest un entier de 64 bits. Lequel utiliser dépend de la taille des nombres avec lesquels vous prévoyez de travailler.

intet longsont des types primitifs, tandis que Integeret Longsont des objets. Les types primitifs sont plus efficaces, mais vous devez parfois utiliser des objets; par exemple, les classes de collection de Java ne peut de travailler sur des objets, donc si vous avez besoin d' une liste d'entiers vous devez en faire un List<Integer>, par exemple (vous ne pouvez pas utiliser intdans un Listdirectement).


6

Integer est un type entier 32 bits signé

  • Désigné comme Int
  • Taille = 32 bits (4byte)
  • Peut contenir des entiers de plage -2,147,483,648 to 2,147,483,647
  • la valeur par défaut est 0


Long est un type entier 64 bits signé

  • Désigné comme Long
  • Taille = 64 bits (8byte)
  • Peut contenir des entiers de plage -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • la valeur par défaut est 0L


Si votre utilisation d'une variable se situe dans la plage de 32 bits, utilisez Int, sinon utilisez long. Habituellement, long est utilisé pour les calculs scientifiques et des trucs comme ça nécessitent beaucoup de précision. (par exemple, valeur de pi).

Le cas de YouTube est un exemple de choix de l'un par rapport à l'autre. Ils ont d'abord défini le compteur de vues vidéo comme un intdébordement lorsque plus de 2 147 483 647 vues ont été reçues pour une vidéo populaire. Étant donné qu'un Intcompteur ne peut pas stocker de valeur supérieure à sa plage, YouTube a changé le compteur en une variable de 64 bits et peut désormais compter jusqu'à 9 223 372 036 854 775 807 vues. Comprenez vos données et choisissez le type qui correspond à une variable 64 bits qui prendra le double de la mémoire qu'une variable 32 bits.


1

Quand il s'agit d'utiliser un nombre très long qui peut dépasser 32 bits à représenter, vous pouvez utiliser long pour vous assurer que vous n'aurez pas de comportement étrange.

À partir de Java 5, vous pouvez utiliser les fonctionnalités in-boxing et out-boxing pour rendre l'utilisation de int et Integer complètement identique. Cela signifie que vous pouvez faire:

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

La boxe dans et hors vous permettent de basculer entre int et entier sans conversion supplémentaire (idem pour Long, Double, Shortaussi)

Vous pouvez utiliser inttout le temps, mais Integercontient des méthodes d'assistance qui peuvent vous aider à effectuer des opérations complexes avec des entiers (tels que Integer.parseInt(String))


0

a) Classe d'objet "Long" versus type primitif "long". (Au moins en Java)

b) Il existe différentes tailles de mémoire (même peu claires) des types primitifs:

Java - tout est clair: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • octet, car .. 1B .. 8b
  • court int .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • long int .. 8B .. 64b

C .. juste désordre: https://en.wikipedia.org/wiki/C_data_types

  • court .. .. 16b
  • int .. .. .. 16b ... wtf?!?!
  • long .. .. 32b
  • long long .. 64b .. désordre! : - /

Cela ne répond pas à la question, qui concerne la différence entre Long et Long, etc.
GreenAsJade

Non, il n'y répond pas explicitement, ne disant pas explicitement la différence entre les types primitifs et les objets de type de données, en fait @GreenAsJade, car la question ci-dessus ne précise aucun langage spécifique. J'ai donc fourni une comparaison - afin que tout le monde puisse vérifier la différence. (à partir des données concrètes, telles que fournies)
Franta

La question énonçait Java.
GreenAsJade le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.