CodeGym /Java Blog /Toto sisi /Java 中的 Append() 方法:StringBuilder 和 StringBuffer
John Squirrels
等級 41
San Francisco

Java 中的 Append() 方法:StringBuilder 和 StringBuffer

在 Toto sisi 群組發布
append()是 StringBuilder 和 StringBuffer 類的一種 Java 方法,用於將一些值附加到當前序列。即使您不知道append()方法是什麼,您也可能已經隱含地使用了它。當您使用 + 運算符連接 Java 中的字符串時會發生這種情況。關鍵是 Java 中的字符串連接是使用 StringBuilder 或 StringBuffer 類及其append()方法實現的。

非常簡要地介紹 String、StringBuffer 和 StringBuilder

您可能知道 String 類是最終的(它沒有子類)並且是不可變的(此類的實例在創建後無法修改)。事實上,由於 String 類的不可變性,每次操作都會創建新的字符串實例,並丟棄舊的,從而產生大量垃圾。要處理因修改 String 對象而產生的臨時垃圾,可以使用 StringBuffer 或 StringBuilder 類。後兩者之間的主要區別在於 StringBuffer 是同步的,而 StringBuilder 不是。因此,對於在多線程環境中頻繁修改的字符串,使用 StringBuffer,在單線程環境中使用 StringBuilder。Java 中的 Append() 方法:StringBuilder 和 StringBuffer - 1

StringBuilder 和 StringBuffer 中的 Append()

append()是 StringBuilder 和 StringBuffer 類的頂級方法之一。它將一個新值附加到當前序列。StringBuffer 和 StringBuilder 類中有 13 種不同的重載append()方法。讓我們看一下 StringBuilder 的 append 方法。不管怎樣,對於 StringBuffer,它們的工作方式完全相同。
  • 公共 StringBuilder 追加(布爾 b)
  • 公共 StringBuilder 追加(字符 c)
  • public StringBuilder append(char[] str)
  • public StringBuilder append(char[] str, int offset, int len)
  • 公共 StringBuilder 追加(CharSequence cs)
  • public StringBuilder append(CharSequence cs, int start, int end)
  • 公共 StringBuilder 追加(雙 d)
  • 公共 StringBuilder 追加(浮動 f)
  • 公共 StringBuilder 追加(int i)
  • 公共 StringBuilder 追加(long lng)
  • 公共 StringBuilder 追加(對像對象)
  • 公共 StringBuilder 附加(字符串 str)
  • 公共 StringBuilder 追加(StringBuffer sb)
讓我們回顧其中的一些,並通過示例來解釋append()方法到底做了什麼。

Java.lang.StringBuilder.append(int i)

java.lang.StringBuilder.append(int i)是一種允許將整數附加到現有 StringBuilder 對象的方法。讓我們看一下使用Java.lang.StringBuilder.append(int i)的例子:

StringBuilder s = new StringBuilder(“I love Java ”);  
int i = 14;
//the method appends StringBuilder and integer   
s.append(i); 
System.out.println(s); 
這裡的輸出將是:
我愛 Java 14
這裡發生了什麼?首先,我們創建了一個名為 s 的 StringBuilder,值為“I love Java”。然後使用append(int)添加一個整數 14 。嚴格來說,我們添加的不是整數,而是字符串“14”,並將更新的 StringBuilder 值更新為“I love Java 14”。因此,該方法將參數轉換為 StringBuilder 對象,將其綁定到現有的 StringBuilder 對象,並返回更新後的對象。

Object、int、boolean 和 String 參數的 StringBuilder append() 示例

同樣的情況也適用於所有其他具有數字、字符串、字符或數組元素的重載方法。讓我們創建一個 LegoBrick 類和 Color 枚舉來演示 public StringBuilder append(Object obj)方法。

//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 +
              '}';
   }
}
現在讓我們創建一個 AppendDemo 類,我們將在其中展示使用 String、int、LegoBrick 和 boolean 附加基本 StringBuilder。聽起來很奇怪,但它確實有效!

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));
   }
}
輸出是:
我愛我愛 Java 我愛 Java14 我愛 Java14LegoBrick{color=RED, isConnected=false} 我愛 Java14LegoBrick{color=RED, isConnected=false}true
首先,我們創建並顯示 StringBuilder“I love”,然後首先,我們使用append()方法 依次向其添加一個字符串、一個 int 數字、一個對象的字符串表示和一個布爾值。

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

讓我們看一下帶有三個參數的append()方法。它將給定 char 數組的子數組的表示添加到字符串中。所以在這裡:
  • cstr是要追加的字符數組
  • 將其設置為要追加的第一個字符的索引
  • length是要附加的字符數。
與其他append()方法類似,這個方法返回一個擴展的 StringBuilder 對象。下面是使用append(char[], cstr, int set, int length)作為 Java 應用程序代碼的一部分 的示例。

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);
   }
}
輸出是:
我愛爪哇

帶有 CharSequence 參數的 StringBuilder append() 方法

您可能已經註意到有兩個方法將 CharSequence 作為參數。
  • 公共 StringBuilder 追加(CharSequence cs)
  • public StringBuilder append(CharSequence cs, int start, int end)
並非所有初學者都知道 CharSequence 是一個接口。根據文檔, CharSequence 是一個可讀的 char 值序列,並提供對許多不同類型的 char 序列的統一、只讀訪問。該接口由 String、StringBuffer、StringBuilder 等 Java 類實現。因此,如果您不知道在您的程序中使用什麼更好,String、StringBuffer 或 StringBuilder,您可以使用 CharSequence。 StringBuilder append(CharSequence cs, int start, int end)幾乎和append(char[] cstr, int set, int length)一樣工作我們在上面討論過。但是,此方法指定子序列的第一個元素和最後一個元素。重要的是要記住 start 包含在子序列中,但 end 不包含(即子序列中的最後一個元素是 end 之前的元素)。這是為什麼?這就是它在 Java 中的方式。讓我們演示一下 CharSequence 是什麼以及append(CharSequence cs)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);
       }
   }
輸出是:
這是 String 這是 StringBuilder 我的 StringBuilder 這是 StringBuilder 我的 StringBuilder 這是 StringBuilder 這是 String 我的 StringBuilder 這是 StringBuilder 這是 String 是
我們創建了兩個 CharSequence,將 String 和 StringBuilder 綁定到它們並打印出來。我們不能直接對myStringBuilder應用append()方法,因為CharSequence沒有這個方法(如果你不明白為什麼,你需要弄清楚繼承以及引用類型的擴展和縮小)。因此,我們創建一個 StringBuilder 並使用 append 方法順序連接兩個 CharSequence。最後,我們為 StringBuilder 添加了子序列“is”(“i”是 myStringBuilder 的第 5 個元素,s 是第 6 個元素。請記住,在該方法中,指定為 end 的元素被排除在子序列之外。

StringBuffer append() 怎麼樣?

StringBuffer.append也有 13 種方法變體,它們的工作方式與 StringBuilder 完全相同。
  • 公共 StringBuffer 附加(布爾 b)
  • public StringBuffer append (char c)
  • public StringBuffer append (char[] str)
  • public StringBuffer append (char[] str, int offset, int len)
  • 公共 StringBuffer 附加(雙 d)
  • public StringBuffer append (float f)
  • public StringBuffer append (int i)
  • 公共 StringBuffer 附加(long lng)
  • 公共 StringBuffer 附加(CharSequence s)
  • public StringBuffer append (CharSequence s, int start, int end)
  • public StringBuffer append (Object obj)
  • public StringBuffer append (String str)
  • 公共 StringBuffer 附加(StringBuffer sb)
讓我們舉一個StringBuffer.append的例子來加入一個子字符串。我們只是以StringBuilder為例,將代碼中的所有StringBuilder都改成StringBuffers。

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);
   }
}
輸出是:
我愛 Java 我愛 Java14
您可以使用本文的每個示例來做到這一點。他們會工作的!

結論

由於 StringBuilder 和 StringBuffer 共享大部分功能,因此這兩個類使用append()方法的方式相似也就不足為奇了。這對開發人員來說是個好消息——您不必為每個類學習單獨的方法。話雖如此,考慮到使用append() 的方法多種多樣,請務必花幾個小時練習將不同數據類型的表示形式添加到字符串中。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION