Heim  >  Artikel  >  Java  >  Grafische Einführung in die Unterschiede zwischen String, StringBuffer und StringBuilder und die Stapelspeicherzuweisung in Java

Grafische Einführung in die Unterschiede zwischen String, StringBuffer und StringBuilder und die Stapelspeicherzuweisung in Java

黄舟
黄舟Original
2017-03-04 09:33:061979Durchsuche

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.

3. e zeigt direkt auf den Speicherplatz von C.

4. Daher wird bei der Verwendung von String empfohlen, die direkte Zuweisung zu verwenden, um den Speicherplatz zu reduzieren und die Leistung zu verbessern.


3. Der Unterschied zwischen String, StringBuffer und StringBuilder

1. String, StringBuffer und StringBuilder werden alle von final geändert und können nicht vererbt und neu geschrieben werden. von.

2. Nach der Instanziierung von String kann die Inhaltsgröße seines Speicherplatzes nicht geändert werden. StringBuffer ist eine threadsichere variable Zeichenfolge, die nach der Instanziierung im Heap-Speicher dynamisch geändert werden kann Länge und Größe sind variabel; nach der Instanziierung von StringBuilder sind auch die Speichergröße und -länge variabel, nein

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?

Tatsächlich hat der obige Code drei Leerzeichen im Speicher geöffnet, nämlich: „Hallo“, „Andy“, „Halloandy“. Ihre Heap-Speichergröße ist festgelegt und schließlich zeigt str auf „Halloandy“. die Heap-Adresse. Wie in der folgenden Abbildung gezeigt:

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). !


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn