CodeGym /Java-Blog /Germany /Append-Methode in Java: StringBuilder und StringBuffer
Autor
Volodymyr Portianko
Java Engineer at Playtika

Append-Methode in Java: StringBuilder und StringBuffer

Veröffentlicht in der Gruppe Germany
append() ist eine Java-Methode in den Klassen StringBuilder und StringBuffer, die einen Wert an einen bestehenden String anhängt. Selbst wenn du nicht wusstest, was die append()-Methode ist, hast du sie wahrscheinlich schon implizit verwendet. Das geschieht, wenn du in Java Strings mit dem +-Operator verkettest. Entscheidend ist, dass die String-Verkettung in Java mit der Klasse StringBuilder oder StringBuffer und deren append()-Methoden implementiert wird.

Ein paar Worte zu String, StringBuffer und StringBuilder

Wie du wahrscheinlich weißt, ist die Klasse String final (sie hat keine Unterklassen) und unveränderlich (Instanzen dieser Klasse können nach der Erstellung nicht mehr verändert werden). Tatsächlich bedeutet die Unveränderlichkeit der String-Klasse, dass als Ergebnis jeder Operation neue String-Objekte erzeugt und alte gelöscht werden. All dies erzeugt eine Menge Müll. Um das Problem des temporären Mülls zu bewältigen, der beim Ändern eines String-Objekts erzeugt wird, kannst du die Klassen StringBuffer oder StringBuilder verwenden. Der Hauptunterschied zwischen ihnen ist, dass StringBuffer synchronisiert ist, während StringBuilder nicht synchronisiert ist. Verwende daher StringBuffer für Strings, die in einer Multithread-Umgebung häufig geändert werden, und StringBuilder in einer Single-Thread-Umgebung.

append() in StringBuilder und StringBuffer

append() ist eine der wichtigsten Methoden der Klassen StringBuilder und StringBuffer (append Java). Die Methode hängt einen neuen Wert an die aktuelle Zeichenkette an (Java append to string). Es gibt 13 verschiedene überladene append()-Methoden in den beiden Klassen StringBuffer und StringBuilder. Schauen wir uns die append-Methode von StringBuilder an. So oder so, die Methoden funktionieren im Fall von StringBuffer exakt gleich.
  • public StringBuilder append(boolean b)
  • public StringBuilder append(char c)
  • public StringBuilder append(char[] str)
  • public StringBuilder append(char[] str, int offset, int len)
  • public StringBuilder append(CharSequence cs)
  • public StringBuilder append(CharSequence cs, int start, int end)
  • public StringBuilder append(double d)
  • public StringBuilder append(float f)
  • public StringBuilder append(int i)
  • public StringBuilder append(long lng)
  • public StringBuilder append(Object obj)
  • public StringBuilder append(String str)
  • public StringBuilder append(StringBuffer sb)
Wir wollen einige davon durchgehen und anhand von Beispielen erklären, was genau die append()-Methode tut.

Java.lang.StringBuilder.append(int i)

java.lang.StringBuilder.append(int i) ist eine Methode, die das Anhängen einer Ganzzahl an ein bestehendes StringBuilder-Objekt ermöglicht. Schauen wir uns Beispiele für die Verwendung von Java.lang.StringBuilder.append(int i)an:

StringBuilder s = new StringBuilder(“I love Java ”);  
int i = 14;
//the method appends StringBuilder and integer   
s.append(i); 
System.out.println(s); 
Die Ausgabe ist dann:
Ich liebe Java 14
Was ist hier passiert? Zunächst haben wir einen StringBuilder namens s mit dem Wert „Ich liebe Java“ erstellt. Dann haben wir mit append(int) eine Ganzzahl, 14, hinzugefügt. Nun, streng genommen haben wir keine Ganzzahl hinzugefügt. Wir haben tatsächlich die Zeichenkette „14“ hinzugefügt und einen aktualisierten StringBuilder mit dem Wert „Ich liebe Java 14“ erhalten. Die Methode wandelt also das Argument in ein StringBuilder-Objekt um, bindet es an ein bestehendes StringBuilder-Objekt und gibt ein aktualisiertes zurück.

StringBuilder.append()-Beispiel für Object-, int-, boolean- und String-Argumente

Die Geschichte ist die gleiche für alle anderen überladenen Methoden mit numerischen, String-, Char- oder Array-Elementen. Lass uns eine LegoBrick-Klasse und ein Color-Enum erstellen, um die Methode public StringBuilder append(Object obj) zu demonstrieren.

//enum with colors 
 public enum Color {
   RED, YELLOW, BLUE;
}
//LegoBrick Class code 
public class LegoBrick {
   Color color;
   boolean isConnected;

   public void connect() {
       System.out.println("This brick is connected");
       this.isConnected = true;
   }

   public void disconnect() {
       System.out.println("Disconnected");
       isConnected = false;
   }

   public LegoBrick(Color color, boolean isConnected) {
       this.color = color;
       this.isConnected = isConnected;
   }

   public Color getColor() {
       return color;
   }

   public boolean isConnected() {
       return isConnected;
   }

   @Override
   public String toString() {
       return "LegoBrick{" +
              "color=" + color +
              ", isConnected=" + isConnected +
              '}';
   }
}
Nun wollen wir eine AppendDemo-Klasse erstellen, mit der wir das Anhängen eines einfachen StringBuilders an einen String, int, LegoBrick und boolean demonstrieren werden. Klingt komisch, aber es funktioniert!

public class AppendDemo {

   public static void main(String[] args) {
       StringBuilder s = new StringBuilder("I love");
System.out.println(s)
//the method appends StringBuilder and String
       s.append(" Java");
       System.out.println(s);
//the method appends StringBuilder and int
       s.append(14);
       System.out.println(s);
       LegoBrick legoBrick = new LegoBrick(Color.RED, false);
//the method appends StringBuilder and LegoBrick 
       s.append(legoBrick);
       System.out.println(s);
//the method appends StringBuilder and boolean
       System.out.println(s.append(5<7));
   }
}
Die Ausgabe ist:
Ich liebe Ich liebe Java Ich liebe Java14 Ich liebe Java14LegoBrick{color=RED, isConnected=false} Ich liebe Java14LegoBrick{color=RED, isConnected=false}true
Zuerst haben wir einen StringBuilder mit dem Wert „Ich liebe“ erstellt und angezeigt. Dann haben wir die append()-Methode verwendet, um nacheinander einen String, einen int und die String-Darstellungen eines Object und eines Boolean hinzuzufügen. Append-Methode in Java: StringBuilder und StringBuffer - 1

StringBuilder append(char[] cstr, int set, int length)

Schauen wir uns die append()-Methode mit drei Parametern an. Sie fügt dem String die String-Repräsentation einer Teilmenge des angegebenen Char-Arrays hinzu. In diesem Fall gilt:
  • cstr ist ein Array von Zeichen, die angehängt werden sollen
  • set ist der Index des ersten anzuhängenden Zeichens
  • length ist die Anzahl der Zeichen, die angehängt werden sollen
Ähnlich wie die anderen append()-Methoden gibt diese ein erweitertes StringBuilder-Objekt zurück. Hier ist ein Beispiel für die Verwendung von append(char[] cstr, int set, int length) als Teil des Java-App-Codes.

public class AppendDemo {
   // an example of using append(char[], cStr, int set, int length)

   public static void main(String[] args) {
       StringBuilder s = new StringBuilder("I love ");
      //here is a char's array, part of which we are going to append to s
       char[] cStr = new char[]
               {'c', 'o', 'd', 'e', 'J', 'a', 'v', 'a', '1', '4'};
       //we append 4 elements of cStr from the 4th element "J"
       s.append(cStr, 4, 4);
       System.out.println(s);
   }
}
Die Ausgabe ist:
Ich liebe Java

StringBuilder append()-Methoden mit einem CharSequence-Argument

Du hast vielleicht zwei Methoden bemerkt, die CharSequence als Argumente haben.
  • public StringBuilder append(CharSequence cs)
  • public StringBuilder append(CharSequence cs, int start, int end)
Nicht jeder Einsteiger weiß, dass CharSequence ein Interface ist. CharSequence ist laut Dokumentation eine lesbare Sequenz von Char-Werten und bietet einen einheitlichen, schreibgeschützten Zugriff auf viele verschiedene Arten von Char-Sequenzen. Das Interface wird von solchen Java-Klassen wie String, StringBuffer, StringBuilder und anderen implementiert. Wenn Sie also nicht wissen, ob es besser ist, String, StringBuffer oder StringBuilder in Ihrem Programm zu verwenden, können Sie CharSequence verwenden. StringBuilder append(CharSequence cs, int start, int end) funktioniert fast wie die oben beschriebene Methode append(char[] cstr, int set, int length). Diese Methode nimmt jedoch das erste Element der Teilsequenz und das letzte. Du darfst nicht vergessen, dass der Startindex in der Teilsequenz enthalten ist, der Endindex jedoch nicht (mit anderen Worten, das letzte Element in der Teilsequenz ist das Element, das vor dem Endindex kommt). Warum ist das so? So ist das nun mal in Java. Sehen wir uns einmal an, was CharSequence ist, zusammen mit den Methoden append(CharSequence cs) und append(CharSequence cs, int start, int end).

public class CharSequenceDemo {

   public static void printCharSequence(CharSequence ch) {
       System.out.println(ch);
   }
       public static void main(String[] args) {
           CharSequence myString = new String("This is String ");
           printCharSequence(myString);
           CharSequence myStringBuilder = new StringBuilder("This is StringBuilder ");
           printCharSequence(myStringBuilder);
           StringBuilder s = new StringBuilder("my StringBuilder ");
//StringBuilder.append           
s.append(myStringBuilder);
           System.out.println(s);
//StringBuilder.append
           s.append(myString);
           System.out.println(s);
           s.append(myString, 5,7);
           System.out.println(s);
       }
   }
Die Ausgabe ist:
Dies ist String Dies ist StringBuilder Mein StringBuilder Dies ist StringBuilder Mein StringBuilder Dies ist StringBuilder Dies ist String Mein StringBuilder Dies ist StringBuilder Dies ist String is
Wir haben zwei CharSequences erzeugt, einen String und einen StringBuilder an sie gebunden und dann ausgegeben. Wir können die append()-Methode nicht direkt auf myStringBuilder anwenden, da CharSequence diese Methode nicht hat (wenn du nicht verstehst, warum, dann musst du dich sowohl mit Vererbung als auch mit dem Erweitern und Einschränken von Referenztypen beschäftigen). Dementsprechend erstellen wir einen StringBuilder und verwenden die append-Methode, um die beiden CharSequences sequentiell zu verketten. Am Ende haben wir die Teilsequenz „is“ an unseren StringBuilder angehängt: „i“ ist das 5. Element von myStringBuilder und „s“ ist das 6. Beachten Sie, dass die Methode das durch den Endindex angegebene Element ausschließt.

Was ist mit StringBuffer.append() (Java append)?

Die Methode StringBuffer.append hat ebenfalls 13 Varianten, die genau so funktionieren wie bei StringBuilder.
  • public StringBuffer append (boolean b)
  • public StringBuffer append (char c)
  • public StringBuffer append (char[] str)
  • public StringBuffer append (char[] str, int offset, int len)
  • public StringBuffer append (double d)
  • public StringBuffer append (float f)
  • public StringBuffer append (int i)
  • public StringBuffer append (long lng)
  • public StringBuffer append (CharSequence s)
  • public StringBuffer append (CharSequence s, int start, int end)
  • public StringBuffer append (Object obj)
  • public StringBuffer append (String str)
  • public StringBuffer append (StringBuffer sb)
Betrachten wir einmal ein Beispiel für die Verwendung von StringBuffer.append zum Zusammenfügen eines Teilstrings. Wir nehmen einfach das StringBuilder-Beispiel und ändern alle Vorkommen von StringBuilder im Code in StringBuffer um.

public class AppendDemo {
   // an example of using append(char[], cStr, int set, int length)

   public static void main(String[] args) {
       StringBuffer s = new StringBuffer("I love ");
      //here is a char's array, part of which we are going to append to s
       char[] cStr = new char[]
               {'c', 'o', 'd', 'e', 'J', 'a', 'v', 'a', '1', '4'};
       //we append 4 elements of cStr from the 4th element "J"
//with StringBuffer.append
       s.append(cStr, 4, 4);
       System.out.println(s);
//StringBuffer.append adds int 14 to s
s.append(14); 
System.out.println(s);
   }
}
Die Ausgabe ist:
Ich liebe Java Ich liebe Java14
Das kannst du mit jedem Beispiel in diesem Artikel tun. Es wird funktionieren!

Zusammenfassung

Da StringBuilder und StringBuffer die meisten Funktionen gemeinsam haben, ist es nicht verwunderlich, dass beide Klassen ähnliche Möglichkeiten bieten, die append()-Methode zu verwenden. Das ist eine gute Nachricht für Entwickler – Sie müssen nicht für jede Klasse eine eigene Methode lernen. In Anbetracht der vielfältigen Möglichkeiten, append() zu verwenden, solltest du ein paar Stunden üben, die String-Repräsentationen verschiedener Datentypen an einen String anzuhängen.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION