2013-10-21 15 views
8

ich ein sehr seltsames Problem bekam, wenn ich versuche 2 Lange Variablen zu vergleichen, zeigen sie immer falsch und ich kann sicherstellen, dass sie die gleiche Anzahl Wert durch das Debuggen in Eclipse haben sein:Was sind nicht 2 Long-Variablen gleich mit == Operator in Java zu vergleichen?

if (user.getId() == admin.getId()) { 
    return true; // Always enter here 
} else { 
    return false; 
} 

beide über 2 Rückgabewerte sind Objekttyp Long, die mich verwirrt haben. Und um zu überprüfen, dass ich eine Hauptmethode wie folgt geschrieben habe:

Long id1 = 123L; 
Long id2 = 123L; 

System.out.println(id1 == id2); 

Es druckt wahr.

So kann mir jemand Ideen geben ?. Ich arbeite seit 3 ​​Jahren in Java Development, kann diesen Fall aber nicht erklären.

+4

Es hängt von der Größe des Long ab. Kleinere Longs und Integer werden beigefügt und sind wirklich identische Objekte, aber längere nicht, und für diese müssen Sie '.equals (...)' verwenden oder sie auspacken. –

Antwort

17

== Vergleiche Referenzen, gleicht vergleicht Wert. Diese beiden Long-Objekte sind Objekte, die Referenzen vergleichen.

ABER Long id1 = 123L; wird automatisch auf ein langes Objekt autoboxed werden Long.valueOf(String) intern verwendet, wird der Prozess einen LongCache verwenden, und 123 ist zwischen dem LongCache [-128.127], so dass die eigentlich das gleiche Objekt sind.

+0

in meinem Fall ist der zurückgegebene ID-Wert 16, der in seinem Bereich nicht überschritten wird. –

+0

yeah, aber diese Longs dürfen nicht von Long.valueOf() erstellt werden, meigh new long (12), also sind sie verschiedene Objekte. – BlackJoker

+0

Runtime-Implementierungen sind garantiert Cache-Integer-Werte-128..127. Werte außerhalb dieses Bereichs oder eines anderen numerischen Typs (z. B. "Long") können zwischengespeichert werden, wenn die Laufzeit feststellt, dass dies in einem bestimmten Fall vorteilhaft wäre, die Spezifikation jedoch nichts über die vorteilhaften Fälle der Laufzeit aussagt oder werde es nicht erkennen. – supercat

6

weil == Referenzwert vergleicht, und kleinere long values are cached

public static Long valueOf(long l) { 
    final int offset = 128; 
    if (l >= -128 && l <= 127) { // will cache 
     return LongCache.cache[(int)l + offset]; 
    } 
    return new Long(l); 
} 

so dass es für kleinere lange Werte arbeitet

Siehe auch

+0

Aber user.getId() gibt nur 16 in meinem Fall zurück, ich denke, es ist klein genug. Wie erklärt man es? –

+0

dann ist es nicht in 'LongCache' gespeichert, http://ideone.com/bq3zpZ –

0

Stuck auf ein Problem für 4 Stunden wegen der Verwendung von == ... Der Vergleich war ok auf Long < 128 aber ko auf größere Werte.

Im Allgemeinen ist es keine gute Idee, == zu verwenden, um Objects zu vergleichen, verwenden Sie .equals() so viel wie möglich! Keep ==, >, <, <= etc. für Primitive.