Wiederverwendbarkeit von Strings in Java?

8
%Vor%

Hier verweisen wir auf String h, um literal hi zu stringeln. JVM verfügt über einen String-Literal-Pool zum Speichern von String-Literalen, so dass wir die Strings wiederverwenden können, da sie unveränderlich sind ...

Wenn wir reusable, sagen, was genau bedeutet das? Sprechen wir über die address ? dass es immer von der gleichen Adresse ausgewählt wird?

    
Nil 25.05.2012, 18:47
quelle

4 Antworten

6

Ja, um die Dinge einfacher zu machen, können Sie sich vorstellen, dass Sie von derselben Adresse wählen, aber um genauer zu sein, Variablen haben denselben Verweis - Bezeichner, den JVM verwenden kann, um die richtige Speicheradresse von zu bilden Objekt (da Objekte im Speicher verschoben werden können).

Sie können es mit einem Code wie diesem testen:

%Vor%     
Pshemo 25.05.2012, 19:05
quelle
8

Im Falle von

%Vor%

Abhängig von der Version des JDK kann der Compiler das tun, was internieren und erstellen Sie eine einzelne Instanz der Byte-Daten, die die "hi" darstellen, und verwenden Sie sie erneut zwischen den Referenzen der to-Variablen. In den neuesten Spezifikationen sind alle String Literale werden in der Permanent Generation in den String-Pool interniert.

Wenn Sie das Schlüsselwort new wie in der letzten Anweisung verwenden, wird eine neue Instanz der genau gleichen Bytes wie ein separates Objekt erstellt.

String-Objekte, die unter Laufzeit erstellt wurden, sind nicht im String-Pool, es sei denn .intern() wird für sie aufgerufen. Dies ist in der Regel nicht erforderlich und kann Probleme verursachen, hat selten erhebliche Vorteile.

%Vor%     
Jarrod Roberson 25.05.2012 18:49
quelle
4

Gemeint ist, dass wenn 20 Objekte den gleichen String verwenden:

%Vor%

Alle diese Objekte verweisen auf dieselbe String-Instanz im Speicher. Und das macht nichts, denn es ist unmöglich, den Inhalt des Strings zu ändern, da er unveränderlich ist. Dieselbe Instanz kann somit ohne Probleme zwischen Objekten geteilt werden.

    
JB Nizet 25.05.2012 18:49
quelle
3

Innerhalb der JVM gibt es einen String Literal-Pool mit allen String s, die während der Laufzeit des Programms erstellt wurden. Wenn wiederverwendbar ist, bedeutet dies, dass ein neues String -Objekt nicht erstellt wird, wenn Sie ein anderes String mit genau denselben Zeichen und derselben Codierung verwenden möchten. Stattdessen verweist die Referenz auf das bereits vorhandene String im String-Pool. Dies wird als Interning bezeichnet.

Dies kann gemacht werden, weil String s in Java unveränderlich sind.

Der Grund dafür ist, die Kosten für das Erstellen eines neuen String -Objekts zu vermeiden.

Hier finden Sie weitere Informationen darüber, was der String-Literal-Pool ist und wie er funktioniert: Ссылка

Sehen Sie sich auch diese Frage an: Sollte ich nicht 'String s = new String (" eine neue Zeichenfolge ");' in Java, auch mit automatischem String-Interning?

    
Radu Murzea 25.05.2012 18:50
quelle

Tags und Links