Long vs Integer, long vs int, ¿qué usar y cuándo?

135

A veces veo que las API usan longor Longo intor Integer, y no puedo entender cómo se toma la decisión para eso.

¿Cuándo debo elegir qué?

Sé marcar la V
fuente

Respuestas:

191

Longes la Objectforma de long, y Integeres la forma de objeto deint .

El longutiliza 64 bits . Los intusos de 32 bits, y así sólo pueden contener números de hasta ± 2 mil millones (-2 31 a 2 31 -1).

Debería usar longy int, excepto donde necesite usar métodos heredados Object, como hashcode. Java.util.collectionslos métodos usualmente usan las Objectversiones en caja ( envueltas), porque necesitan funcionar para cualquiera Object, y un tipo primitivo, como into long, no es unObject .

Otra diferencia es que longy intson valores de paso por valor , mientras que Longy Integerson valores de paso por referencia , como todos los tipos Java no primitivos. Entonces, si fuera posible modificar un LongoInteger (no lo es, son inmutables sin usar el código JNI), habría otra razón para usar uno sobre el otro.

Una diferencia final es que a Longo Integerpodría ser null.

Borealid
fuente
55
@Borealid, esto está muy mal, Java siempre se pasa por valor, no hay nada como pasar por referencia en Java.
Diego Ramos
9
¿UH Huh? Bien, exploremos la idea de que Java nunca pasa una referencia. Si llamo a una función dándole un int [2], y luego dentro de la función cambio el valor contenido en el primer elemento de esa matriz, ¿verá la persona que llama la función ese cambio? ¿Si? Bueno, eso se debe a que lo que se pasó a la función no fueron los valores en la matriz, sino más bien una referencia a esos valores. "Pasar por valor" significa que los datos reales se están copiando sin indirección. Quien te enseñó que Java era paso por valor te perjudicó.
Borealid el
3
@Borealid es incorrecto, el valor se cambia porque se creó una nueva copia de la referencia a la matriz, es por eso que quien llame a la función verá el cambio, esto todavía se pasa por valor. No puedo creer que digas que hay un pase por referencia en Java. Nunca pasa la referencia original a la función.
Diego Ramos
66
En un mundo teórico en el que Java se comportó de manera completamente diferente a como lo hace realmente, y pasar un objeto o matriz a una función resultó en una copia totalmente separada (donde las modificaciones dentro de la función no se reflejaron en absoluto para los llamantes), ¿cómo podría describir el idioma? Teniendo en cuenta que de lo que estamos hablando no es completamente lo que Java realmente hace.
Borealid el
2
@DiegoRamos tiene razón. Java siempre se pasa por valor, la confusión se crea porque el valor cuando no es primitivo es una referencia de memoria, el intercambio estático no funciona en Java, más detalles aquí: journaldev.com/3884/…
Panthro
28

Hay un par de cosas que no puedes hacer con un tipo primitivo:

  • Tener un nullvalor
  • sincronizar con ellos
  • Úselos como parámetro de tipo para una clase genérica, y relacionados con eso:
  • Pasarlos a una API que funcione con Objects

A menos que necesite alguno de esos, debe preferir los tipos primitivos, ya que requieren menos memoria.

Michael Borgwardt
fuente
24
  • Por defecto, use un int, cuando tenga números.
  • Si el rango de intes demasiado pequeño, use unlong
  • Si el rango de longes demasiado pequeño, useBigInteger
  • Si necesita manejar sus números como objeto (por ejemplo, al ponerlos en un Collection, manejo null, ...) use Integer/ en su Longlugar
Joachim Sauer
fuente
13

Un intes un entero de 32 bits; a longes un número entero de 64 bits. Cuál usar depende de qué tan grandes sean los números con los que espera trabajar.

inty longson tipos primitivos, mientras que Integery Longson objetos. Los tipos primitivos son más eficientes, pero a veces necesitas usar objetos; por ejemplo, clases de colección de Java sólo se puede trabajar con objetos, por lo que si necesita una lista de números enteros que tienen para que sea una List<Integer>, por ejemplo (no se puede utilizar inten un Listdirectamente).

Jesper
fuente
6

El entero es un tipo entero de 32 bits con signo

  • Denotado como Int
  • Tamaño = 32 bits (4byte)
  • Puede contener enteros de rango -2,147,483,648 to 2,147,483,647
  • el valor predeterminado es 0


Long es un tipo entero de 64 bits con signo

  • Denotado como Long
  • Tamaño = 64 bits (8byte)
  • Puede contener enteros de rango -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • el valor predeterminado es 0L


Si su uso de una variable cae en el rango de 32 bits, use Int, de lo contrario use long. Por lo general, se usa mucho tiempo para cálculos científicos y cosas así necesitan mucha precisión. (p. ej. valor de pi).

Un ejemplo de elegir uno sobre el otro es el caso de YouTube. Primero definieron el contador de vistas de video como el intque se desbordó cuando se recibieron más de 2,147,483,647 vistas en un video popular. Dado que un Intcontador no puede almacenar ningún valor más que su rango, YouTube cambió el contador a una variable de 64 bits y ahora puede contar hasta 9.223.372.036.854.775.807 vistas. Comprenda sus datos y elija el tipo que se ajuste a una variable de 64 bits que ocupará el doble de memoria que una variable de 32 bits.

Todo es variado
fuente
1

Cuando se trata de usar un número muy largo que puede superar los 32 bits para representar, puede usar mucho tiempo para asegurarse de que no tendrá un comportamiento extraño.

Desde Java 5, puede usar las funciones de entrada y salida para hacer que el uso de int e Integer sea completamente el mismo. Significa que puedes hacer:

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

El dentro y fuera del boxeo le permiten cambiar entre int Entero y sin ninguna conversión adicional (lo mismo para Long, Double, Shorttambién)

Puede usar inttodo el tiempo, pero Integercontiene algunos métodos auxiliares que pueden ayudarlo a realizar algunas operaciones complejas con enteros (como Integer.parseInt(String))

Houcem Berrayana
fuente
0

a) clase de objeto "Long" versus tipo primitivo "long". (Al menos en Java)

b) Hay diferentes tamaños de memoria (incluso poco claros) de los tipos primitivos:

Java: todo claro: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • byte, char .. 1B .. 8b
  • int corto .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • largo int .. 8B .. 64b

C .. simplemente lío: https://en.wikipedia.org/wiki/C_data_types

  • corto .. .. 16b
  • int .. .. .. 16b ... wtf?!?!
  • largo .. .. 32b
  • largo largo .. 64b .. desastre! : - /
Franta
fuente
Esto no responde la pregunta, que trata sobre la diferencia entre Long y long, etc.
GreenAsJade
No, no lo responde explícitamente, no dice explícitamente la diferencia entre un tipo primitivo frente a objetos de tipo de datos, de hecho @GreenAsJade, porque la pregunta anterior no establece ningún lenguaje específico. Así que proporcioné una comparación, para que todos puedan comprobar la diferencia. (de los datos duros, según lo provisto)
Franta
La pregunta decía Java.
GreenAsJade