In Java werden Zeichenfolgen als Objekte der Klasse String im Speicher gespeichert.
Wenn Speicher für ein Java-Programm zugewiesen wird, teilt die JVM (Java Virtual Machine) den zugewiesenen Speicher in zwei Teile. Ein Teil ist Stack und der andere Teil ist Heap. Im Heap-Speicher weist Java etwas Speicher zu, insbesondere für Literale. Dieser Speicher wird als String-Konstantenpool (SCP) bezeichnet. SCP ist der vordefinierte Bereich innerhalb des Heaps. Der String-Pool hilft dabei, viel Platz für Java Runtime zu sparen. Die String-Klasse verwendet SCP zum Speichern eindeutiger String-Literale.
Im Stapelspeicher werden Variablen oder Variablenreferenzen oder Referenzen auf die Objekte gespeichert.
Im Heap-Speicher werden alle dynamisch zugewiesenen Objekte gespeichert. Um einem Objekt Speicher zuzuweisen, verwenden wir ein neues Schlüsselwort.
Es gibt zwei Möglichkeiten, String-Objekte zu erstellen.
String str1 = „MyString“;
Immer wenn wir ein String-Literal erstellen, prüft JVM zunächst, ob das String-Literal bereits im String-Konstantenpool vorhanden ist. Wenn nicht verfügbar, wird ein neues String-Literal in SCP erstellt.
Im Bild oben zeigt str1 auf „MyString“ in SCP. Im Folgenden wird beschrieben, wie mit neu erstellten Zeichenfolgenliteralen umgegangen wird.
String str2 = new String(“MyString”); //Instanziierung der String-Klasse mit einem neuen Schlüsselwort
Wenn ein String-Objekt mit einem neuen Schlüsselwort erstellt wird, werden zwei Objekte erstellt. Eine im SCP, eine andere im Heap und die Referenzvariable wird im Stapel gespeichert.
Wir haben bereits das Literal „MyString“ erstellt, indem wir
verwendet habenString str1 = „MyString“;
Da wir in SCP keine Duplikate haben können, erstellt JVM kein weiteres Objekt in SCP, sondern gibt den vorhandenen Verweis auf die Variable str3 im Stapel zurück und erstellt ein Objekt im Heap. Str3 zeigt auf das Objekt „MyString“ im Heap, aber nicht in SCP.
Im Folgenden sind die verschiedenen Fälle aufgeführt, in denen Speicher für Zeichenfolgenobjekte zugewiesen wird.
Fall 1: Wie die oben definierten Zeichenfolgenobjekte im Speicher gespeichert werden.
öffentliche Klasse stringsStorageConcept
{
public static void main(String[] args)
{
String str1 = „MyString“;
String str2 = new String(“MyString”);
System.out.println(str1 == str2); //Ausgabe:False
System.out.println(str1.equals(str2)); //Ausgabe:True
}
}
Wenn wir str1 und str2 mit dem Operator „==“ vergleichen, wird „false“ zurückgegeben. Wie wir wissen, vergleicht der Operator „==“ ihre physischen Adressen. Hier in unserem Beispiel zeigt str1 auf das Objekt in SCP und str2 zeigt auf das Objekt im Heap. Es wird also false zurückgegeben.
Aber im Fall von str1.equals(str2) prüft die Funktion „equals“, wie wir wissen, dass die einzelnen Zeichen sowohl str1 als auch str3 den gleichen gespeicherten Wert haben, und gibt „true“ zurück.
Fall 2: Ein weiteres String-Literal
String str3 = „MyString“;
Sowohl str1 als auch str3 verweisen auf dasselbe String-Literal in SCP.
öffentliche Klasse stringsStorageConcept
{
public static void main(String[] args)
{
String str1 = „MyString“;
String str3 = „MyString“;
System.out.println(str1 == str2); //Ausgabe:True
System.out.println(str1.equals(str2)); //Ausgabe:True
}
}
s1 == s3 gibt „true“ zurück, da der „==“-Operator ihre physischen Adressen vergleicht, aber nicht den Inhalt.
s1.equals(s3) gibt true zurück und die Funktion „equals“ prüft die einzelnen Zeichen in beiden Referenzvariablen.
Fall 3: Ein weiteres String-Objekt wird mit einem neuen Schlüsselwort erstellt
String str4 = neuer String(“NewString”);
In diesem Fall sucht JVM nach dieser Zeichenfolge in SCP und kann das Zeichenfolgenobjekt mit dem Wert „NewString“ nicht finden. Daher erstellt es zwei Objekte, eines in SCP und ein weiteres im Heap, in dem die Referenzvariable str4 gespeichert wird der Stapel. Str4 hat den Verweis auf das Objekt im Heap.
Fall 4: Ein weiteres String-Literal wird erstellt.
String str5 = „NewString“;
In diesem Fall prüft JVM in SCP, ob dieses Literal bereits verfügbar ist oder nicht. Hier ist „NewString“ bereits in SCP vorhanden, sodass JVM kein Duplikat in SCP erstellt, sondern den Verweis auf die Variable str5 zurückgibt.
Fall 5: Zuweisen einer Zeichenfolge zu einer anderen Zeichenfolge
String str4 = neuer String(“NewString”);
String str6 = str4; //Zuweisen
Hier verweisen str6 und str4 auf dasselbe Objekt im Heap und löschen den Wert in str4 nicht.
öffentliche Klasse stringsStorageConcept
{
public static void main(String[] args)
{
String str4 = neuer String(“NewString”);
String str6 = str4;
System.out.println(str4 == str6); //Ausgabe:true
}
}
JVM gibt die Referenz des „NewString“ im Heap an die Variable str6 weiter. Das ist der Grund, warum str4 == str6 true zurückgibt.
Zusammenfassend lässt sich sagen, dass das Erstellen von String-Objekten mit String-Literalen und dem „new“-Operator seine Vor- und Nachteile hat.
Durch die Verwendung von String-Literalen können wir den Speicher effizienter machen, indem wir keine Duplikate erstellen. JVM erstellt ein eindeutiges Objekt und die Zeichenfolge bleibt für immer im SCP. Der Nachteil dabei ist, dass der String-Pool eine feste Größe hat und irgendwann voll wird.
Durch die Verwendung eines neuen Schlüsselworts werden jedoch zwei Objekte erstellt, eines im SCP und das andere im Heap. Wenn wir das Objekt in einem Heap nicht benötigen, wird es von einem Garbage Collector gelöscht, um Platz zu schaffen. Der Nachteil dabei ist jedoch, dass JVM mit einem „neuen“ Operator immer ein neues Objekt erstellen muss und dies eine Überlastung für JVM darstellt.
Das obige ist der detaillierte Inhalt vonSpeicherzuweisung von Strings in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!