2016-05-27 7 views
1

Ich habe gelernt, dass die folgenden Variablen den gleichen Platz im Speicher in der JVM teilen, weil ihr Wert gleich ist:Gibt es andere Variablen oder Objekte in Java, die wie String-Objekte einen Speicherort oder Objektreferenz teilen, wenn ihr Wert gleich ist?

String banana = "yummy"; 
String strawberry = "yummy"; // banana == strawberry is true here 

, wenn Sie einen von ihnen mit „neuen“ wie dieses Schlüsselwort bieten:

String banana = "yummy"; 
String strawberry = new String("yummy"); // banana == strawberry is false 

, damit ein neues String-Objekt erzwungen wird.

Was ich frage mich ist, passiert das für andere Objekte als Objekte der String-Klasse in Java?

Antwort

0

Nein, dies gilt nur für String-Objekte.

-1
String banana = "yummy"; 

ist eine Referenz auf "yummy" im String-Pool.

String strawberry = new String("yummy"); 

neues Objekt in den

heap erstellen

String hat Methode intern()

Gibt eine kanonische Darstellung für das String-Objekt.

und dieser Code druckt wahr:

String banana = "yummy"; 
String strawberry = new String("yummy"); 
System.out.println(banana == strawberry.intern()); 

String javadoc Siehe

Wie dem auch sei Methode gleich für Objekte Referenztyp.

+0

Dies beantwortet die gestellte Frage nicht. –

3

Ja, es gibt andere Arten, wo dies gilt. Hier ein Beispiel:

Integer a = 42; 
    Integer b = 42; 

Instanzen Integer im Bereich von -128 bis +127 produziert von garantiert Autoboxing das gleiche Objekt sein; siehe JLS 5.1.7 Es gibt auch ähnliche Garantien für Boolean, Byte, Short und Character. Es kann auch für größere Bereiche der obigen und für gelten, obwohl dies plattformspezifisch ist.

In der Tat, was Sie wirklich fragen, ist für Beispiele von Typen T wo t1.equals(t2)t1 == t2 ... für einige Teilmenge von T impliziert. Dies gilt für alle Array-Typen und alle Klassenarten, bei denen Object.equals nicht überschrieben wird. Beispiele für letztere sind alle enum Typen, java.lang.Class, java.lang.StringBuilder und java.lang.Object selbst.