2013-02-01 17 views
8

Mögliche Duplizieren:
Integer == int allowed in javavergleichen Long-Wert in Java

Was ist der Unterschied zwischen den beiden folgenden Aussagen ist

Long l1 = 2L; 
if(l1 == 2) 
    System.out.println("EQUAL");       
if(l1.longValue() == 2) 
    System.out.println("EQUAL"); 

Beide gleiche Ergebnis geben „EQUAL "Aber mein Zweifel ist, dass Long Objekt ist. Wie ist es gleich?

+3

Dies liegt an [automatisches Unboxing] (http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html). – assylias

+0

Es ist wegen der automatischen Boxen und Unboxing-Funktion von Java –

+0

können Sie klar erklären – PSR

Antwort

10

Wie bereits in den Kommentaren aus, wenn

if(l1 == 2) 

Longl1 bekommt automatisch unboxed seine primitive Art zu tun, long. So ist der Vergleich zwischen long und int.

Im zweiten Fall l1.longValue() kehrt der long Wert, als eine primitive, der durch das LongLong Objekt dargestellt, so dass der Vergleich wieder zwischen long und int sein wird. Antworten your comment, werfen Sie einen Blick auf What is the main difference between primitive type and wrapper class?

Der Link in den Kommentaren über autoboxing deckt dieses Thema recht gut.

+0

ok. Jetzt verstehe ich.thank u – PSR

-1

Dieses Verhalten wird durch Erweitern und Boxen erläutert.

Im ersten Beispiel

if(l1 == 2) 

, was passiert, ist wie folgt:

1: Der Compiler bemerkt, dass Sie einen Wrapper (Long) mit einem Grundwert (int) vergleichen, so dass es Boxen der primitive, was zu:

if (l1 == new Integer(2))

seit 2 ein int (den 'L' am Ende fehlt).

2: Der Compiler jetzt bemerkt, dass wir eine Long mit einem Integer vergleichen, so dass es die ganze Zahl auf eine lange erweitert, was zu:

if (l1 == new Long(new Integer(2))

3: Jetzt sind wir zwei Longs zu vergleichen.

Der andere Fall ist einfacher, hier das Ergebnis ist einfach:

if (2L == 2)

die primitiven Werte zu vergleichen, die auch erlaubt ist, obwohl sie unterschiedliche Typen sind.

+0

Nicht sicher über Ihre Erklärung über das erste Beispiel. Ich denke es ist _unboxing_ von 'l1' das passiert hier, nicht _boxing_ von' 2' in 'Integer'. Wenn es so wäre, wäre das einzige, was den '== 'Operator erklären könnte, der' true' zurückgibt, Caching, was keine gültige Erklärung wäre, wenn es 'new Integer (2)' trotzdem tun würde. Wenn Sie 'new Long (123456) == 123456' eingeben, wird auch 'true' zurückgegeben, und es scheint sich um einen Wert außerhalb des Caching-Bereichs zu handeln. –