2016-04-15 32 views
0
String s1=new String("abcd"); 
s2=s1.intern(); 

Es wird gesagt, dass intern() wird ein String-Literal im Pool erstellen, wenn es nicht bereits vorhanden ist.Erstellt intern() jemals ein Literal im Pool?

Meine Frage ist wann wird dieses Szenario entstehen, dass String-Objekt vorhanden ist, aber nicht das Literal? Und der Praktikant() muss tatsächlich gehen und ein neues Literal erstellen und dann den Verweis auf das Literal zurückgeben.

+0

Wir wollen nicht jede * Zeichenfolge in den String-Pool einfügen. Das Speichern von Strings im Pool ist nur sinnvoll, wenn Sie diese Zeichenfolge später wiederverwenden möchten, z. B. für Zeichenfolgenliterale, die Sie in Code erstellt haben, wo Sie sie oft benötigen, wie 'for (i ..) {System.out.print ("Schreib deine Nummer:"); array [i] = readNumber();} '. Aber wenn Sie etwas Text von einer externen Quelle wie Datei/Konsole/Socket/andere wie zeilenweise lesen, wollen Sie JVM nicht wirklich daran erinnern, alle Zeilen zu speichern. Sie möchten diese möglicherweise nur einmal drucken und GC aus dem Speicher löschen lassen. – Pshemo

Antwort

2

Zum Beispiel:

String first = "ab"; 
String second = "cd"; 
String interned = first.concat(second).intern(); 

Die meisten der Strings in einem Programm werden dynamisch erstellt: durch Werte verketten, so dass sie über eine Socket-Empfang, um sie von Dateien oder Datenbanken zu lesen, oder von der Konsole oder einer GUI.

Beachten Sie, dass Ihre Terminologie falsch ist. intern() erstellt kein String-Literal. Es fügt dem Pool einen String hinzu, und String-Literale (d. H. Zeichenfolgen, die wörtlich im Byte-Code wie "abcd" erscheinen) werden im Pool zusammen mit explizit intern gespeicherten Strings gespeichert.

+0

Ist es möglich zu kontrollieren, welche Strings in den Pool gehen? Mein Verständnis ist, dass jeder String im Pool sein sollte. – noobCoder

+2

Zeichenfolgenliterale befinden sich im Pool. Andere Strings sind nicht, es sei denn du hast sie interniert. Warum zum Teufel willst du alle Fäden in den Pool legen? Angenommen, Sie lesen zeilenweise eine 1-GB-Datei, um einige Daten zu extrahieren und die Daten in eine andere Datei zu schreiben. Sie würden dann 2 GB Speicher benötigen, um all diese Zeilen im Speicher zu speichern, für nichts: Sie werden diese Zeilen nie wiederverwenden. –

+0

Sie benötigen nicht 2 GB Arbeitsspeicher; Das Hinzufügen einer Zeichenfolge zum Pool bedeutet nicht, dass eine neue Instanz erstellt wird - das ist implementierungsspezifisch. Möglicherweise erhalten Sie dieselbe Instanz, die jetzt Mitglied des Pools ist. Wichtiger ist, dass selbst nach dem Hinzufügen von Strings zum Pool immer noch Müll gesammelt werden kann. Der Speicherverbrauch würde sich also nicht ändern. Das Hinzufügen dieser temporären Zeichenfolgen zu dem Pool erzeugt jedoch einen Overhead ohne irgendeinen Vorteil, da das Internieren irgendeine Art von Nachschlagen erfordert, z. Hashing, und der Garbage Collector kann zusätzliche Arbeit zum Löschen der Referenzen des Pools haben. – Holger