Gleichheit und Identität von Strings

KnightMove

Mitglied
Hi alle... ich mache gerade einen Java-Kurs und habe folgende Aufgabe vor mir:

In diesem Beispiel beschäftigen wir uns mit den Eigenheiten von Zeichenketten
(Strings). Gehe zuerst am Papier theoretisch durch, welchen Wert die einzelnen
testStrings–Tests haben (also ob sie true oder false ausgeben). Dann führe den Code
aus und vergleiche jeden einzelnen Test. Was fällt auf? Erkläre das Verhalten schriftlich!


Java:
public class Aufgabe15 {
  public static void main(String... args) {
	  String s1 = "xyz";
	  String s2 = "xyz";
	  testStrings(s1,s2);
	  s2 = new String(s2);
	  testStrings(s1,s2);
	  s2 = "x";
	  s2 += "yz";
	  testStrings(s1,s2);
	  s1 = s1.intern();
	  s2 = s2.intern();
	  testStrings(s1,s2);
  }
  static void testStrings ( final String a, final String b) {
	System.out.printf ("<%s>.equals(<%s>) -> %s\n" , a, b, a. equals (b) ) ;
	System.out.printf ("<%s> == <%s> -> %s\n\n" , a, b, a == b) ;
	}
}

Ich habe das Programm schon laufen lassen. In allen Fällen gilt Gleichheit; nur im ersten und vierten haben wir Identität, sonst nicht. Aber ich verstehe im ersten Falle noch nicht, warum. Zuerst habe ich doch zwei verschiedene Strings s1 und s2 definiert. Das sind doch zwei verschiedene Objekte, und nicht dasselbe?
 
Strings werden nicht wie andere Objekte im Heap verwaltet sondern im sog. Pool. Jedes Stringobjekt ist nebenbei bermerkt auch immutable (unveränderbar) und deshalb wird bei jeder wertzuweißung ein neues objekt im pool erzeugt, aber nur wenn das gleiche objekt nicht bereits im pool exisitert.
 
Strings werden nicht wie andere Objekte im Heap verwaltet sondern im sog. Pool. Jedes Stringobjekt ist nebenbei bermerkt auch immutable (unveränderbar) und deshalb wird bei jeder wertzuweißung ein neues objekt im pool erzeugt, aber nur wenn das gleiche objekt nicht bereits im pool exisitert.
Wobei in diesem Falle der Compiler einfach alle Stringliterale in einem Packet mit gleichem Wert zu einem einzigen String umbaut.
 

Zurück
Oben