Long vs Integer, long vs int, was und wann zu verwenden?

135

Manchmal sehe ich, dass APIs longoder Longoder intoder verwenden Integer, und ich kann nicht herausfinden, wie die Entscheidung dafür getroffen wird?

Wann soll ich was wählen?

Ich weiß, wie man das V ankreuzt
quelle

Antworten:

191

Longist die ObjectForm von longund Integerist die Objektform von int.

Der longverwendet 64 Bit . Der intverwendet 32 ​​Bit und kann daher nur Zahlen bis zu ± 2 Milliarden (-2 31 bis +2 31 -1) aufnehmen.

Sie sollten longund verwenden int, es sei denn, Sie müssen Methoden verwenden, von denen geerbt wurde Object, z hashcode. Java.util.collectionsMethoden verwenden normalerweise die Box- ObjectVersionen ( umhüllt), da sie für alle funktionieren Objectmüssen und ein primitiver Typ wie intoder longkein ist Object.

Ein weiterer Unterschied besteht darin , dass longund intsind Pass-by-Wert , während Longund Integersind Pass-by-Referenzwert , wie alle nicht-primitive Java - Typen. Wenn es also möglich wäre, ein Longoder zu ändern Integer(es ist nicht so, dass sie ohne Verwendung von JNI-Code unveränderlich sind), gäbe es einen anderen Grund, einen über den anderen zu verwenden.

Ein letzter Unterschied ist, dass ein Longoder sein Integerkönnte null.

Borealid
quelle
5
@Borealid, das ist so falsch, Java wird immer als Wert übergeben, es gibt nichts wie Referenzübergabe in Java.
Diego Ramos
9
Ähhh? Okay, lassen Sie uns die Idee untersuchen, dass Java niemals eine Referenz übergibt. Wenn ich eine Funktion aufrufe, die ihr ein int [2] gibt, und dann innerhalb der Funktion den Wert ändere, der im ersten Element dieses Arrays enthalten ist, wird der Aufrufer der Funktion diese Änderung sehen? Ja? Das liegt daran, dass an die Funktion nicht die Werte im Array übergeben wurden, sondern ein Verweis auf diese Werte. "Wert übergeben" bedeutet, dass die tatsächlichen Daten selbst ohne Indirektion kopiert werden. Wer Ihnen beigebracht hat, dass Java ein Wert für die Weitergabe ist, hat Ihnen einen schlechten Dienst erwiesen.
Borealid
3
@Borealid Sie sind falsch, der Wert wird geändert, weil eine neue Kopie des Verweises auf das Array erstellt wurde. Deshalb wird jeder, der die Funktion aufruft, die Änderung sehen, dies wird immer noch als Wert übergeben. Ich kann nicht glauben, dass Sie sagen, dass es in Java eine Referenz gibt. Sie übergeben niemals den ursprünglichen Verweis auf die Funktion.
Diego Ramos
6
In einer theoretischen Welt, in der sich Java völlig anders verhält als tatsächlich, und die Übergabe eines Objekts oder Arrays an eine Funktion zu einer völlig separaten Kopie führte (in der Änderungen innerhalb der Funktion für Aufrufer überhaupt nicht berücksichtigt wurden), wie würden Sie dann vorgehen? die Sprache beschreiben? Denken Sie daran, dass das, worüber wir sprechen, nicht das ist, was Java tatsächlich tut.
Borealid
2
@DiegoRamos ist richtig. Java wird immer als Wert übergeben, die Verwirrung entsteht, weil der Wert, wenn nicht primitiv eine Speicherreferenz ist, statisches Austauschen in Java nicht funktioniert, weitere Details hier: journaldev.com/3884/…
Panthro
28

Es gibt einige Dinge, die Sie mit einem primitiven Typ nicht tun können:

  • Habe einen nullWert
  • auf ihnen synchronisieren
  • Verwenden Sie sie als Typparameter für eine generische Klasse und beziehen Sie sich darauf:
  • Übergeben Sie sie an eine API, die mit Objects funktioniert

Sofern Sie keinen dieser Typen benötigen, sollten Sie primitive Typen bevorzugen, da diese weniger Speicher benötigen.

Michael Borgwardt
quelle
24
  • Verwenden Sie standardmäßig ein int, wenn Sie Zahlen halten.
  • Wenn der Bereich intzu klein ist, verwenden Sie along
  • Wenn der Bereich longzu klein ist, verwenden SieBigInteger
  • Wenn Sie Ihre Zahlen als Objekt behandeln müssen (z. B. wenn Sie sie in ein Collection, Handling null, ...), verwenden Sie stattdessen Integer/Long
Joachim Sauer
quelle
13

An intist eine 32-Bit-Ganzzahl. a longist eine 64-Bit-Ganzzahl. Welche verwendet werden soll, hängt davon ab, wie groß die Zahlen sind, mit denen Sie voraussichtlich arbeiten werden.

intund longsind primitive Typen, während Integerund LongObjekte sind. Primitive Typen sind effizienter, aber manchmal müssen Sie Objekte verwenden. Beispielsweise können Javas Auflistungsklassen nur mit Objekten arbeiten. Wenn Sie also eine Liste von Ganzzahlen benötigen, müssen Sie diese beispielsweise zu einer Liste machen List<Integer>(die Sie nicht direkt intin einer verwenden Listkönnen).

Jesper
quelle
6

Integer ist ein vorzeichenbehafteter 32-Bit-Integer-Typ

  • Bezeichnet als Int
  • Größe = 32 bits (4byte)
  • Kann ganze Zahlen des Bereichs enthalten -2,147,483,648 to 2,147,483,647
  • Standardwert ist 0


Long ist ein vorzeichenbehafteter 64-Bit-Integer-Typ

  • Bezeichnet als Long
  • Größe = 64 bits (8byte)
  • Kann ganze Zahlen des Bereichs enthalten -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • Standardwert ist 0L


Wenn Ihre Verwendung einer Variablen in den 32-Bit-Bereich fällt, verwenden Sie Int, andernfalls verwenden Sie long. Normalerweise wird long für wissenschaftliche Berechnungen verwendet und solche Dinge erfordern viel Genauigkeit. (zB Wert von pi).

Ein Beispiel für die Auswahl eines über dem anderen ist der Fall von YouTube. Sie definierten zuerst den Videoansichtszähler als einen, intder übergelaufen war, als mehr als 2.147.483.647 Aufrufe zu einem beliebten Video empfangen wurden. Da ein IntZähler keinen Wert speichern kann, der über seinem Bereich liegt, hat YouTube den Zähler in eine 64-Bit-Variable geändert und kann jetzt bis zu 9.223.372.036.854.775.807 Aufrufe zählen. Verstehen Sie Ihre Daten und wählen Sie den Typ, der als 64-Bit-Variable passt. Dies beansprucht doppelt so viel Speicher wie eine 32-Bit-Variable.

Alles ist gut
quelle
1

Wenn Sie eine sehr lange Zahl verwenden möchten, deren Darstellung 32 Bit überschreiten kann, können Sie long verwenden, um sicherzustellen, dass Sie kein seltsames Verhalten haben.

Ab Java 5 können Sie In-Boxing- und Out-Boxing-Funktionen verwenden, um die Verwendung von int und Integer vollständig gleich zu machen. Es bedeutet, dass Sie Folgendes tun können:

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

Die in und aus Boxen können Sie zwischen int und Integer ohne zusätzliche Konvertierung wechseln (gleich für Long, Double, Shortauch)

Sie können verwenden die intganze Zeit, aber Integerenthält einige Hilfsmethoden , die Sie einige komplexe Operationen mit ganzen Zahlen zu tun , helfen kann (wie Integer.parseInt(String))

Houcem Berrayana
quelle
0

a) Objektklasse "Long" versus primitiver Typ "Long". (Zumindest in Java)

b) Es gibt verschiedene (sogar unklare) Speichergrößen der primitiven Typen:

Java - alles klar: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • Byte, Zeichen .. 1B .. 8b
  • kurz int .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • long int .. 8B .. 64b

C .. nur Chaos: https://en.wikipedia.org/wiki/C_data_types

  • kurz .. .. 16b
  • int .. .. .. 16b ... wtf?!?!
  • lang .. .. 32b
  • lang lang .. 64b .. Chaos! : - /
Franta
quelle
Das beantwortet nicht die Frage, die über den Unterschied zwischen Lang- und lange usw. ist
GreenAsJade
Nein, es wird nicht explizit beantwortet und der Unterschied zwischen primitiven Typen und Datentypobjekten, in der Tat @GreenAsJade, nicht explizit angegeben, da in der obigen Frage keine bestimmte Sprache angegeben ist. Also habe ich einen Vergleich gemacht - damit jeder den Unterschied überprüfen kann. (aus den harten Daten, wie angegeben)
Franta
Die Frage lautete Java.
GreenAsJade