Analysieren wir das folgende Java, um die Identität und Gleichheit von Strings zu verstehen:
public static void testEquality(){
String str1 = "Hello world.";
String str2 = "Hello world.";
if (str1 == str2)
System.out.print("str1 == str2\n");
else
System.out.print("str1 != str2\n");
if(str1.equals(str2))
System.out.print("str1 equals to str2\n");
else
System.out.print("str1 doesn't equal to str2\n");
String str3 = new String("Hello world.");
String str4 = new String("Hello world.");
if (str3 == str4)
System.out.print("str3 == str4\n");
else
System.out.print("str3 != str4\n");
if(str3.equals(str4))
System.out.print("str3 equals to str4\n");
else
System.out.print("str3 doesn't equal to str4\n");
}
Wenn die erste Zeile des Codes String str1 = "Hello world."
ausgeführt wird, eine Zeichenkette \Hello world."
wird erstellt, und die Variable str1
bezieht sich darauf. Eine andere Zeichenfolge "Hello world."
wird aus Optimierungsgründen bei der Ausführung der nächsten Code-Zeile nicht erneut erzeugt. Die Variable str2
verweist auch auf die bestehenden ""Hello world."
.
Der Betreiber ==
prüft die Identität von zwei Objekten (ob zwei Variablen auf dasselbe Objekt verweisen). Da str1
y str2
auf dieselbe Zeichenfolge im Speicher verweisen, sind sie identisch miteinander. Die Methode equals
prüft die Gleichheit von zwei Objekten (ob zwei Objekte den gleichen Inhalt haben). Natürlich ist der Inhalt von str1
y str2
sind gleich.
Wenn Code String str3 = new String("Hello world.")
ausgeführt wird, eine neue Instanz von string mit dem Inhalt "Hello world."
erstellt, auf die sich die Variable str3
. Und dann eine weitere Instanz von string mit Inhalt "Hello world."
wird erneut erstellt und durch str4
. Desde str3
y str4
sich auf zwei verschiedene Instanzen beziehen, sind sie nicht identisch, aber ihre Inhalt sind gleich.
Daher enthält die Ausgabe vier Zeilen:
Str1 == str2
Str1 equals str2
Str3! = str4
Str3 equals str4