Aber was passiert, wenn der Pool bereits die wörtliche "abc" hat? Wird es doppelte Literale im Pool geben?
Nein.
String c = new String("abc");
ist semantisch äquivalent zu
String tmp = "abc";
String c = new String(tmp);
Damit sollte klar sein, dass kein zusätzlicher Eintrag in der Zeichenfolge-Pool wird gerade erstellt, da die wörtliche als Argument an die Zeichenfolgenkonstruktor verwendet wird.
Sie haben recht, dass new String(...)
eine Zeichenfolge auf dem Heap erstellt. Wenn Sie also sowohl den Heap- als auch den Stringpool betrachten, werden mehrere Objekte "abc"
, aber nicht mehr als eins im Zeichenfolgenpool sein.
[...] Das ist, wenn wir String-Literale verwenden. Wird das Literal im String-Pool wiederverwendet, wenn wir String a = new String("abc");
angeben?
Ja, das String-Pool-Literal wird wiederverwendet, wenn Sie dem Konstruktor "abc" als Argument übergeben. Das resultierende String-Objekt befindet sich jedoch nicht im Pool, sondern auf dem Heap.
'String c = new String ("foo"); 'erstellt einen String in Heap und nicht im Pool, wenn Sie' intern() 'aufrufen, dann wird es ein Teil des Pools sein – silentprogrammer
Ich habe nie das Gegenteil gesagt. Anstatt dies als Kommentar zu mehreren vorhandenen Antworten zu veröffentlichen, schlage ich vor, dass Sie eine eigene Antwort posten. (Während "intern()" mit Strings und dem String-Pool verwandt ist, sehe ich nicht, wie es für diese spezielle Frage relevant ist.) – aioobe