Junior
161
Was ist der Unterschied zwischen der Erstellung eines Strings mit new String() und der Verwendung eines String-Literals?
Antwort von AI
sobes.tech KI
Bei der Verwendung eines String-Literals ("abc") wird die Zeichenkette im String-Pool erstellt. Wenn bereits eine Zeichenkette mit demselben Wert im Pool existiert, wird eine Referenz auf dieses bestehende Objekt zurückgegeben. Dies ist eine Optimierung zur Speicherersparnis.
Bei Verwendung von new String("abc") wird immer ein neues String-Objekt im Heap erstellt, auch wenn bereits eine Zeichenkette mit demselben Wert im Pool existiert.
Beispiel:
// Es wird ein String-Literal "hello" erstellt. Falls es noch nicht im Pool ist, wird es hinzugefügt.
// str1 verweist auf das Objekt im Pool.
String str1 = "hello";
// Das Literal "hello" wird erneut verwendet. Da es bereits im Pool ist,
// verweist str2 ebenfalls auf dasselbe Objekt im Pool wie str1.
String str2 = "hello";
// Es wird ein neues String-Objekt mit dem Wert "hello" im Heap erstellt.
// str3 verweist auf dieses neue Objekt im Heap, nicht auf das im Pool.
String str3 = new String("hello");
// Referenzüberprüfung:
// str1 und str2 verweisen auf dasselbe Objekt im Pool.
System.out.println(str1 == str2); // true
// str1 verweist auf das Objekt im Pool, str3 auf das neue Objekt im Heap.
System.out.println(str1 == str3); // false
// Wertüberprüfung:
// Alle Strings haben den gleichen Wert.
System.out.println(str1.equals(str3)); // true
Unterschiede in der Tabelle:
| Kriterium | String-Literal ("abc") |
new String("abc") |
|---|---|---|
| Erstellungsort | String-Pool | Heap (Heap) |
| Objekterstellung | Gibt ein existierendes zurück oder erstellt ein neues | Erstellt immer ein neues Objekt |
| Speicheroptimierung | Nutzt den Pool effizient für Wiederholungen | Kann Duplikate erstellen, weniger effizient |
Vergleich der Referenzen (==) |
Häufig true für Strings mit demselben Wert |
Immer false für Strings mit demselben Wert, die separat erstellt wurden |