Lassen Sie uns zunächst über String sprechen:
Sobald ein String-Objekt erstellt wurde, kann sein Wert nicht mehr geändert werden. Es wird zurückgesetzt, um Speicherplatz zum Speichern des geänderten Objekts freizugeben, d. h. zum Ändern der String-Referenz.
Da die unterste Ebene von String ein Array zum Speichern von Werten verwendet, kann die Länge des Arrays nicht geändert werden, was zu dem oben genannten Problem führt.
Wenn wir einen String während des eigentlichen Entwicklungsprozesses häufig ändern müssen, führt die Verwendung von String zu einer Verschwendung von Speicherplatz. Wie sollten wir dieses Problem lösen?
Die Antwort besteht darin, StringBuffer zu verwenden, um dieses Problem zu lösen.
Lassen Sie uns ausführlich über StringBuffer sprechen:
StringBuffer ähnelt String. Die unterste Ebene verwendet auch ein Array zum Speichern von Zeichenfolgenwerten und der Standardlänge des Arrays ist 16, das heißt, ein leeres StringBuffer-Objekt
Objekt, die Array-Länge beträgt 16. Durch die Instanziierung eines StringBuffer-Objekts wird ein 16-stelliger String-Puffer erstellt.
Aber wenn wir den parametrisierten Konstruktor aufrufen, um ein StringBuffer-Objekt zu erstellen, beträgt die Länge des Arrays nicht mehr 16. Stattdessen wird die Länge des Arrays basierend auf dem Wert des aktuellen Objekts
bestimmtDie Länge des Arrays. Die Länge ist „die Länge des aktuellen Objektwerts + 16“.
Nachdem ein StringBuffer erstellt wurde, stehen 16 Zeichen Platz zum Ändern seines Werts zur Verfügung. Wenn der geänderte Wertebereich 16 Zeichen überschreitet, wird zunächst geprüft, ob die Kapazität des ursprünglichen char-Arrays des
StringBuffer-Objekts die neue Zeichenfolge aufnehmen kann. Wenn dies nicht möglich ist, wird das char-Array erweitert.
Wie erweitert sich StringBuffer?
Die Logik der Erweiterung besteht darin, ein neues char-Array zu erstellen, die vorhandene Kapazität zu verdoppeln und 2 hinzuzufügen. Wenn es immer noch nicht groß genug ist, entspricht es direkt der erforderlichen Kapazität. Kopieren Sie nach Abschluss der Erweiterung
den Inhalt des ursprünglichen Arrays in das neue Array und zeigen Sie schließlich mit dem Zeiger auf das neue char-Array.
Schauen wir uns StringBuffers Bruder an – StringBuilder
StringBuilder und StringBuffer haben dieselbe übergeordnete Klasse, AbstractStringBuilder, und die implementierten Schnittstellen sind genau gleich, beide implementiert
java.io.Serializable, CharSequence zwei Schnittstellen.
Was ist dann der Unterschied zwischen ihnen?
Der größte Unterschied besteht darin, dass StringBuffer die Synchronisierung für fast alle Methoden implementiert, der Thread relativ sicher ist und die Datensynchronisierung in einem Multithread-System garantiert werden kann.
StringBuilder tut dies nicht Implementieren Sie die Synchronisierung. Es ist nicht threadsicher und StringBuilder kann nicht in Multithread-Systemen verwendet werden.
Verwendungsszenarien von StringBuffer und StringBuilder:
Verwenden Sie StringBuffer, wenn die Thread-Sicherheit nicht berücksichtigt werden muss, kann es verwendet werden Szenarien, in denen Effizienz angestrebt wird.
Das obige ist der detaillierte Inhalt vonDie Unterschiede und Prinzipien von String, StringBuffer und StringBuilder in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!