Die String-Klasse in Java ist eine sehr häufig verwendete Klasse, aber ihren Details wird am wenigsten Aufmerksamkeit geschenkt, sodass sich die meisten Interviews auf diese Klasse konzentrieren. Beispielsweise öffnet String str = new String("hello"); mehrere Speicherplätze, den Unterschied zwischen String und StringBuffer usw. Hier ist mein Verständnis:
String ist eine durch final geänderte Klasse und kann nicht vererbt werden. StringBuffer ist ebenfalls eine von final modifizierte Klasse.
1. JVM-Speicheraufteilung
Es gibt hauptsächlich 4 Speicherbereiche in Java: Stapelspeicherbereich, Heap-Speicherbereich, globaler Datenbereich und globaler Codebereich
1. Stapelspeicherplatz: Speichert alle Objektnamen (die Adresse des referenzierten Heapspeicherplatzes wird gespeichert)
2. Heapspeicherplatz: Speichert den spezifischen Inhalt jedes Objekts
3. Globaler Datenbereich: Statische Typdatenattribute (globale Daten) speichern
4. Globaler Codebereich: Alle Methodendefinitionen speichern
In der JVM ist der Heap-Speicher der Speicherplatz, der den Inhalt der Objektinstanziierung (Programmdaten) speichert. Der Stapelspeicher speichert den Namen des Objekts und sein Inhalt zeigt auf die Adresse des entsprechenden Heaps.
Man kann auch sagen: Alle Objektnamen werden im Stapelspeicher gespeichert und der spezifische Inhalt des Objekts wird im Heapspeicher verwaltet. Referenztypdaten müssen das Schlüsselwort new verwenden, um Platz im Heapspeicher freizugeben .
2. Speicherzuweisung von Sring
String hat eine Besonderheit: Beim Erstellen eines String-Objekts können Sie es direkt mit „Neue Konstruktion“ oder „Hallo“ erstellen. Von den beiden Methoden wird empfohlen, die zweite zu verwenden.
1. String a = "hello";
2. String a= new String("hello");
Die Erklärung lautet wie folgt:
1: Im Stapelspeicher ist eine Objektreferenz a definiert, die auf die Speicheradresse des Werts „Hallo“ im Heapspeicher zeigt. Schließlich wurde ein Speicherplatz geöffnet
2: Eine Objektreferenz von a wird im Stapelspeicher neu definiert, wobei zuerst auf die Speicheradresse des Heap-Speichers mit dem Wert „Hallo“ und dann auf die Adresse des Heap-Speichers mit dem Wert „Hallo“ gezeigt wird " nach neu. Am Ende wurden zwei Bereiche geöffnet. Der erste Bereich hat keine Objektreferenzen und wird von der JVM als Garbage Collection erfasst.
Das Diagramm sieht wie folgt aus:
>
package andy.string.test; /** * @author Zhang,Tianyou * version:2014-11-25 下午4:15:14 * * */ public class TestString { public static void main(String[] args){ String a = "hello"; String b = "hello"; String c = new String("hello"); String d = new String(); d = "hello"; String e = c; System.out.println("a==b ? " + (a== b)); System.out.println("a==c ? " + (c== b)); System.out.println("a==d ? " + (a== d)); System.out.println("a==e ? " + (a== e)); System.out.println("c==d ? " + (c== d)); System.out.println("c==e ? " + (c== e)); } }
Davon nur a==b==d, c=e.
Erklärung:
1. String möchte nicht jedes Mal auf den Heap-Speicher warten, wenn er neu ist, und d ist Weisen Sie nach new eine neue Adresse zu und geben Sie die Adresse nach new auf, um auf die Speicheradresse zu verweisen, die a entspricht, sodass sie gleich sind.
2. Der Heap-Speicherplatz, auf den die direkte Zuweisungsmethode „Hallo“-Zuweisung verweist, ist derselbe. String verwendet ein gemeinsames Design in Java. Dieser Objektpool kann mehrere Objekte speichern. Wenn das neu instanziierte Objekt bereits im Objektpool vorhanden ist, wird es nicht wiederholt definiert und direkt aus dem Objektpool verwendet. . Wenn
für vorhandenen Inhalt verwendet wird, verweist das Objekt daher auf die Raumadresse der Instanz.
Der Unterschied besteht darin, dass StringBuilder nicht threadsynchronisiert ist und daher effizienter arbeiten muss als StringBuffer.
Das werden einige Leute denken:
String str = "hello" > Hat sich der Wert von str nicht auch geändert?
und StringBuffer öffnet nur einen Speicherplatz. Sie können APPEND verwenden, um Vorgangsinhalte wie Löschen hinzuzufügen. String Jedes Mal, wenn ein Objekt generiert wird, wirkt sich dies auf die Systemleistung aus. Insbesondere wenn sich zu viele nicht referenzierte Objekte im Speicher befinden, beginnt der GC der JVM zu arbeiten und die Geschwindigkeit wird definitiv recht hoch sein langsam. Wenn Sie jedoch die StringBuffer/StringBuilder-Klasse verwenden, ist das Ergebnis jedes Mal ein anderer Vorgang am StringBuffer/StringBuilder-Objekt selbst, anstatt ein neues Objekt zu generieren und dann die Objektreferenz zu ändern.
Daher ist es beim Zuweisen einer Zeichenfolge in einer Schleife am besten, StringBuffer (thread-sicher) oder StringBuilder zu verwenden, was Speicher sparen und die Leistung verbessern kann
.
Das Obige ist der Unterschied zwischen String, StringBuffer und StringBuilder in Java und dem durch die Stapelspeicherzuweisung eingeführten Inhalt. Weitere verwandte Inhalte finden Sie unter PHP Chinese (www.php.cn). !