CodeGym /Java 博客 /随机的 /Java 中的 Append() 方法:StringBuilder 和 StringBuffer
John Squirrels
第 41 级
San Francisco

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

已在 随机的 群组中发布
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