Der Unterschied zwischen String, StringBuilder und StringBuffer in Java (Nachdruck)

Der Unterschied zwischen String, StringBuilder und StringBuffer in Java

  Als ich kürzlich Java lernte, stieß ich auf eine Frage: Was sind die Unterschiede zwischen den drei Klassen String, StringBuilder und StringBuffer? Ich habe im Internet nach einigen Informationen gesucht und nachdem ich sie verstanden hatte, habe ich sie hier für die Bequemlichkeit aller zusammengestellt. Schau es mir an kann Ihnen auch dabei helfen, Ihre Erinnerung an diese Wissenspunkte während Ihres Lernprozesses zu vertiefen. Wenn es Fehler gibt, korrigieren Sie mich bitte.

  Die Unterschiede zwischen diesen drei Klassen bestehen hauptsächlich in zwei Aspekten, nämlich der Laufgeschwindigkeit und der Thread-Sicherheit.

  1. Lassen Sie uns zunächst über die Laufgeschwindigkeit oder Ausführungsgeschwindigkeit sprechen. In diesem Zusammenhang ist die Laufgeschwindigkeit: StringBuilder > StringBuffer > String

  Der Grund, warum String am langsamsten ist:

  String ist eine String-Konstante, während StringBuilder und StringBuffer beide String-Variablen sind. Das heißt, sobald das String-Objekt erstellt wurde, kann das Objekt nicht mehr geändert werden, aber die Objekte der beiden letztgenannten sind Variablen und können geändert werden. Nehmen Sie den folgenden Code als Beispiel:

 

1 String str="abc";
2 System.out.println(str);
3 str=str+"de";
4 System.out.println(str);

 

  Wenn Sie diesen Code ausführen, werden Sie feststellen, dass zuerst „abc“ und dann „abcde“ ausgegeben wird. Es scheint, dass das str-Objekt geändert wurde. Tatsächlich ist dies nur eine Illusion. So geht die JVM damit um Diese Codezeilen. Erstellen Sie zunächst ein String-Objekt str und weisen Sie str „abc“ zu. In der dritten Zeile erstellt die JVM dann tatsächlich ein neues Objekt mit dem Namen str und fügt dann den Wert des ursprünglichen str hinzu und „ de" Weisen Sie es dann einem neuen str zu, und der ursprüngliche str wird vom Garbage Collection-Mechanismus (GC) der JVM recycelt. Daher wurde str nicht tatsächlich geändert. Das heißt, das oben erwähnte String-Objekt kann nicht einmal geändert werden es entsteht. . Daher ist der Betrieb von String-Objekten in Java tatsächlich ein Prozess, bei dem ständig neue Objekte erstellt und alte Objekte recycelt werden, sodass die Ausführungsgeschwindigkeit sehr langsam ist.

  Die Objekte von StringBuilder und StringBuffer sind Variablen. Die Bearbeitung von Variablen bedeutet, das Objekt direkt zu ändern, ohne Vorgänge zu erstellen und wiederzuverwenden, sodass die Geschwindigkeit viel schneller ist als bei String.

  Darüber hinaus weisen wir manchmal solchen Zeichenfolgen Werte zu

1 String str="abc"+"de";
2 StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
3 System.out.println(str);
4 System.out.println(stringBuilder.toString());

  Auf diese Weise lauten die Ausgabeergebnisse ebenfalls „abcde“ und „abcde“, aber die Geschwindigkeit von String ist viel schneller als die Antwortgeschwindigkeit von StringBuilder. Dies liegt daran, dass die Operationen in Zeile 1 und

  String str="abcde";

  ist genau das Gleiche, also wird es sehr schnell sein, und wenn es in der folgenden Form geschrieben wird

1 String str1="abc";
2 String str2="de";
3 String str=str1+str2;

  Anschließend erstellt und recycelt die JVM weiterhin Objekte, um diesen Vorgang wie oben erwähnt auszuführen. Die Geschwindigkeit wird sehr langsam sein.

  2. Lassen Sie uns über Thread-Sicherheit sprechen

  In Bezug auf die Thread-Sicherheit ist StringBuilder Thread-unsicher, während StringBuffer Thread-sicher ist.

  Wenn ein StringBuffer-Objekt von mehreren Threads im String-Puffer verwendet wird, können viele Methoden in StringBuffer das synchronisierte Schlüsselwort haben, sodass die Thread-Sicherheit garantiert werden kann. StringBuilder-Methoden verfügen jedoch nicht über dieses Schlüsselwort, sodass die Thread-Sicherheit nicht garantiert werden kann. , einige falsch Es kann zu Operationen kommen. Wenn es sich bei der auszuführenden Operation um einen Multithread-Vorgang handelt, muss daher StringBuffer verwendet werden. In Single-Thread-Situationen wird jedoch empfohlen, den schnelleren StringBuilder zu verwenden.

  3. Zeichenfolge zusammenfassen
  : Geeignet für eine kleine Anzahl von Zeichenfolgenoperationen

  StringBuilder: Geeignet zum Ausführen einer großen Anzahl von Vorgängen am Zeichenpuffer in einem einzelnen Thread

  StringBuffer: Geeignet für die Ausführung einer großen Anzahl von Vorgängen im Zeichenpuffer unter Multithreading

 

-------------------------------------------------- --------Der obige Artikel ist   ein Nachdruck des Artikels des Autors von Blog Garden Sufeng . Wenn der Autor möchte, dass ich ihn lösche, senden Sie bitte eine private Nachricht.

Guess you like

Origin blog.csdn.net/liyangufo/article/details/83449974