Wie speichert Java Strings und wie funktioniert der Substring intern? [geschlossen]

8
%Vor%

Hier ist die Ausgabe, die ich auf Java 1.6.0_27 bekomme:

%Vor%

Kann jemand bitte die Ausgabe erklären. Ich weiß, Java unterscheidet zwischen String in Heap gespeichert und String in String "gemeinsamen Pool" gespeichert (die intern gespeichert werden kann). Wie unterscheidet sich ihre Repräsentation intern? Wie ändert es den Teilstringalgorithmus? Bitte zitieren Sie Bücher / Artikel / Blogs etc. wo immer es angebracht ist.

    
Bruce 07.01.2013, 10:00
quelle

2 Antworten

21

Siehe die Kommentare:

%Vor%

Anmerkungen:

  • Seit Java 7u6 gibt die Teilzeichenkette eine neue Zeichenkette anstelle einer Sicht auf die ursprüngliche Zeichenkette zurück (was für das Beispiel jedoch keinen Unterschied macht)
  • Sonderfall beim Aufruf von str1.substring(0,str1.length()); - siehe Code:

    %Vor%

BEARBEITEN

  

Was ist eine Ansicht?

Bis Java 7u6 ist ein String im Grunde ein char[] , das die Zeichen des Strings mit einem Offset und einem count enthält (dh der String besteht aus count -Zeichen beginnend mit der offset -Position in% co_de) %).

Beim Aufrufen der Teilzeichenfolge wird eine neue Zeichenfolge mit demselben char[] , aber einem anderen Versatz / Anzahl erstellt, um effektiv eine Sicht auf die ursprüngliche Zeichenfolge zu erstellen. (Außer wenn count = Länge und Offset = 0 wie oben erklärt).

Seit Java 7u6 wird jedes Mal ein neues char[] erstellt, weil in der String-Klasse kein% co- de% oder char[] -Feld mehr vorhanden ist.

  

Wo wird der gemeinsame Pool genau gespeichert?

Dies ist implementierungsspezifisch. Der Standort des Pools wurde in den letzten Versionen tatsächlich verschoben. In neueren Versionen wird es auf dem Heap gespeichert.

  

Wie wird der Pool verwaltet?

Hauptmerkmale:

  • String-Literale werden im Pool gespeichert
  • Gespeicherte Zeichenketten werden im Pool gespeichert ( count )
  • Wenn eine Zeichenkette offset interniert ist (weil es ein Literal ist oder weil new String("abc").intern(); aufgerufen wird), gibt die JVM eine Referenz auf eine Zeichenkette im Pool zurück, wenn es eine ist, die S bis% co_de ist % (daher intern() sollte immer true zurückgeben).
  • Strings im Pool können Garbage Collection sein (was bedeutet, dass eine interne Zeichenfolge zu einem späteren Zeitpunkt aus dem Pool entfernt werden kann, wenn sie voll ist)
assylias 07.01.2013, 10:02
quelle
1

String ist unveränderliches Objekt.

String#subString - Erstellt einen neuen String. Quelle

Im Code ist es [jdk 6 öffnen] -

%Vor%     
Subhrajyoti Majumder 07.01.2013 10:02
quelle

Tags und Links