Vergleichen Sie nicht-primitive Long-Werte 127 und 128
Möchte ich zum vergleichen von zwei Lange Objekten Werte mit if
Bedingungen. Wenn diese Werte weniger als 128die if
Zustand funktioniert einwandfrei, aber wenn Sie sind größer als oder gleich 128Vergleich fehlschlägt.
Beispiel:
Long num1 = 127;
Long num2 = 127;
if (num1 == num2) {
//Works ok
}
Vergleich auf der code oben funktioniert, aber nicht in den folgenden code:
Long num1 = 128;
Long num2 = 128;
if (num1 == num2) {
//Does NOT work
}
Warum ist es ein problem, im Vergleich Lange Variablen mit Werten die größer als 127? Wenn die Variablen, Datentypen geändert werden lange primitivedann die Vergleiche funktionieren, die für alle Fälle.
InformationsquelleAutor der Frage Viraj Dhamal | 2013-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java-caches Integer-Objekte, die Instanzen aus dem Bereich von -128 bis 127. Dieser sagte:
127
(zwischengespeichert), die gleiche Objekt-Instanz wies die von allen Referenzen. (N-Variablen, 1 Instanz)128
(nicht zwischengespeichert), haben Sie eine Objekt-Instanz hingewiesen, die von jeder Referenz. (N Variablen, N-Instanzen)Deshalb:
Ausgänge:
Für die 127L Wert, da beide Referenzen (val1 und val2) auf das gleiche Objekt-Instanz im Speicher (Cache), es gibt
true
.Auf der anderen Seite, für die 128 Wert, da es keine Instanz für die es im Arbeitsspeicher zwischengespeichert wurde, wird eine neue erstellt für jede neue Aufgaben für Box-Werte, so dass zwei unterschiedliche Instanzen (wies von val3 und val4) und die Rückkehr
false
auf den Vergleich zwischen Ihnen.Passiert, nur weil Sie vergleichen zwei
Long
Objekt-Referenzennichtlong
primitive Werte, mit der==
Betreiber. Wenn es nicht für diesen Cache-Mechanismus, der diese Vergleiche würde immer nicht, deshalb ist das wirkliche problem hier ist der Vergleich der boxed-Werte mit==
Betreiber.Änderung dieser Variablen zu den primitiven
long
Typen, die das verhindern, aber im Falle Sie benötigen, um Ihren code mithilfeLong
Objekte, Sie können sicher machen Sie diese Vergleiche mit der folgenden Ansätze:IMOes ist immer eine gute Idee zu halten mit .equals () - Methoden beim Umgang mit Objekt-Vergleiche.
Haftungsausschluss: die Meisten Vergleiche fehl, wenn diese Werte null sind (selbst casting zu lange, wird eine Ausnahme werfen), so dass zusätzliche checkings sind erforderlich, um Platz für diese Szenarien.
Referenz-links:
InformationsquelleAutor der Antwort everton
num1
undnum2
sind Lange Gegenstände. Sie sollten mitequals()
zu vergleichen.==
Vergleich funktioniert vielleicht manchmal, weil der Weg JVM-Boxen primitive, aber nicht von ihm abhängen.InformationsquelleAutor der Antwort Nishan
Java-caches auf die primitiven Werte von -128 bis 127. Wenn wir vergleichen zwei Lange Objekte, die java-intern Typ warf es zu den primitiven Wert, und vergleichen Sie Sie. Aber über 127 der Lange Objekt nicht erhalten Art Kaste. Java speichert die Ausgabe von .valueOf() Methode.
Diese Zwischenspeicherung arbeitet für Byte, Short, Long von -128 bis 127.
Für Integer-caching Werke Von -128 bis java.lang.Integer.IntegerCache.hohe und 127, je nachdem welcher größer ist.(Wir können set-top-level-Wert, bis die Integer-Werte sollten zwischengespeichert werden, durch die Verwendung von java.lang.Integer.IntegerCache.high).
Float-und Double-Objekte wird nie zwischengespeichert.
Charakter erhalten-cache von 0 bis 127
Die Sie vergleichen zwei Objekte. so == Betreiber prüft die Gleichheit von Objektreferenzen. Es gibt folgende Möglichkeiten, es zu tun.
1) Typumwandlung beide Objekte in primitive Werte und vergleichen
2) Lesen Sie den Wert des Objekts und vergleichen Sie
3) Verwenden Sie equals () - Methode auf Objekt-Vergleich.
InformationsquelleAutor der Antwort Jay
Vergleich von nicht-primitives (aka Objekte) in Java mit
==
vergleicht Ihre Referenz anstelle Ihrer Werte.Long
ist eine Klasse und damitLong
Werte sind Objekte.Das problem ist, dass die Java-Entwickler wollte, dass die Menschen zu verwenden
Long
wie Sie verwendet werdenlong
um Kompatibilität zu gewährleisten, führte zu dem Konzept des autoboxing, die im wesentlichen die Funktion, dasslong
-Werte geändert werden, umLong
-Objekte und Umgekehrt, wie gebraucht. Das Verhalten von autoboxing ist nicht genau vorhersehbar die ganze Zeit, obwohl, so ist es nicht vollständig angegeben.So sicher zu sein und um vorhersehbare Ergebnisse verwenden Sie immer
.equals()
zu vergleichen, Objekte und verlassen Sie sich nicht auf autoboxing in diesem Fall:InformationsquelleAutor der Antwort LionC