2012-10-13 3 views
9

kann Jeder Körper erklären, was in der Ausgabe passiert. If == wird verwendet, um zwei ref. Variable es einfach überprüfen Sie seine Referenz, wenn sie gleich sind, dann, wenn es Körper eingeben, dann warum die Hölle aa == bb ist gleich, wenn statische Methode valueOf() Creation und ee == ff ist nicht gleich (was in Ordnung ist) beim Erstellen sein Objekt mit neuem Schlüsselwort?operator == different Verhalten auf Wrapper-Klasse Objekt

static void main(String args[]) 
{ 
    Integer aa = Integer.valueOf("12"); 
    Integer bb = Integer.valueOf("12"); 
    if(aa==bb)System.out.println("aa==bb"); 
    if(aa!=bb)System.out.println("aa!=bb"); 
    Integer ee = new Integer("12"); 
    Integer ff = new Integer("12"); 


    if(ee==ff)System.out.println("ee==ff"); 
    if(ee!=ff)System.out.println("ee!=ff"); 
} 

Ausgabe:

aa == bb

ee = ff

+0

Ein interessanter Artikel, der Ihr Problem beschreibt: http://tech.puredanger.com/2007/02/01/valueof/ –

Antwort

11

Die == Komparator prüft, ob Objekt Gleichheit!

Da Integer.valueOf verwaltet einen Cache von Integer-Objekte mit dem Wert von -128 bis 127 valueOf(String) kehrt das Objekt zwischengespeichert, so dass die == comparance ergibt wahr.

Integer a1 = new Integer("12"); 
Integer b1 = new Integer("12"); 
//a1 == b1 returns false because they point to two different Integer objects 

Integer aa = Integer.valueOf("12"); 
Integer bb = Integer.valueOf("12"); 
//aa == bb returns true because they point to same cached object 

Für die comparance von Objektwerten verwenden, um die immer .equals Methode, für Primitiven, wie int, können lange usw. Sie verwenden, um die == Komparator.

+0

perfekte Antwort. wusste nichts über das Cache-Ding. Mit 127 und 128 überprüft, um unterschiedliche Ergebnisse zu erhalten. –

+2

In Ihrer Antwort ist "// a == b ist wahr" nicht falsch, denn wenn wir nicht einen String mit der neuen String() -Methode erstellen, zeigen Strings mit demselben Wert auf dasselbe String-Objekt. Sie können bitte einmal rennen und prüfen. –

+0

@Ivar, dann gebe besser Beispiel für Integer, warum gibst du Menschen eine falsche Antwort ?. Da diese Antwort am höchsten ist, werden die Leute denken, dass es richtig ist, aber in Wirklichkeit ist die Aussage (// a == b ist falsch) falsch. Soll ich einen Screenshot einfügen? Ich werde keine Änderungen vorschlagen, aber die Antwort besser ändern. Und ich weiß nicht, wie Leute einfach antworten, ohne vollständige Antwort zu lesen und ohne zu überprüfen, ob es richtig ist oder nicht. Und wenn ich den Code ändere, muss ich die ganze Antwort ändern. Das ist wie das Entfernen von komplettem Code. –

3

Da Integer.valueOf hält Cache von ganzen Zahlen von -128 zu 127

Hier ist der Quellcode von valueOf man deutlich sehen kann, dass es gleiches Objekt zurück, wenn Integer-Wert zwischen -128 zu 127

public static Integer valueOf(int i) { 
    if(i >= -128 && i <= IntegerCache.high) 
     return IntegerCache.cache[i + 128]; 
    else 
     return new Integer(i); 
} 

ist so Ihre == gibt True zurück. Wenn value mehr als das ist, wird es immer false zurückgeben.

Integer aa = Integer.valueOf("1200"); 
    Integer bb = Integer.valueOf("1200"); 
    aa == bb --> false 

Sie sollten immer prüfen Gleichheit mit equals Methode

ee.equals(ff); 

Wenn Sie eine weitere hinzufügen, wenn mit unter

if (ee.equals(ff)) 
     System.out.println("ee equals ff"); 

Ausgabe

ee equals ff 
1

Für ee und ff sein zwei Objekte von Integer werden auf Heap erstellt, daher verweisen beide auf verschiedene Objekte, so dass sie bei Verwendung des Operators == nicht gleich sind.

1

new Integer("12") erstellt ein neues Integer-Objekt mit dem Wert 12. Unabhängig davon, wie oft Sie das tun, erstellen Sie jedes Mal ein brandneues Objekt. Deshalb funktioniert == im zweiten Fall nicht.

Die JVM verwaltet einen Cache der Integer-Objekte für Werte, von denen angenommen wird, dass sie häufiger verwendet werden (-128 - 127). Integer.valueOf("12") hinter der Szene macht das gleiche (new Integer("12")), aber bevor Sie das tun, checkt in diesem Cache, wenn für diesen Wert das Objekt bereits im Cache existiert, wenn es das tut, dann ist es das, was es zurückgibt, sonst erstellt es ein neues, fügt hinzu es in den Cache und gibt es zurück. Deshalb funktioniert == im ersten Fall.

Auch für Objekte sollte == niemals für Gleichheitsprüfungen verwendet werden, stattdessen sollten sie nur für Identitätsprüfungen verwendet werden (z. B. um festzustellen, ob sich zwei verschiedene Variablen auf dasselbe Objekt beziehen). Verwenden Sie für die Überprüfung der Gleichheit immer die Methode equals.

+0

Interessant. Ich kannte das Caching-Ding nicht ... danke :) –

+0

Gern geschehen. :) –