StringBuffer 和 StringBuilder 类

基本介绍

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

使用示例:

1
2
3
4
5
6
7
8
9
public class Test{
  public static void main(String args[]){
    StringBuffer sBuffer = new StringBuffer("菜鸟教程官网:");
    sBuffer.append("www");
    sBuffer.append(".runoob");
    sBuffer.append(".com");
    System.out.println(sBuffer);  
  }
}

方法:http://www.runoob.com/java/java-stringbuffer.html

深入理解

https://zhuanlan.zhihu.com/p/62780312

Java 提供的三种操作字符串对象的方法:StringStringBufferStringBuilder。它们的相同点都是用来封装字符串,都实现了 CharSequence 接口。区别如下:

  1. 关于可变性:

    • String 是一个不可变类,创建之后直到销毁,这个对象都是不可被改变的;
    • StringBufferStringBuilder 都继承自 AbstractStringBuilder,它的底层使用字符数组保存字符串,是一个可变类。
  2. 关于初始化方法:

    • String 类可以使用直接赋值的方法进行初始化:String s = "Hello";
    • StringBufferStringBuilder 只能使用 new 的这种构造方法赋值。
  3. 关于修改一个字符串,以字符串追加为例:

    • String 可以直接使用累加的方法:

      1
      
      String str = "Hello,"; str += "World";
      

      这种方法看起来很方便,实际上底层是销毁了原来的对象后创建了一个新的对象;

    • StringBufferStringBuilder 等价于使用下面的代码:

      1
      
      StringBuffer sb = new StringBuffer("Hello,"); sb.append("World");
      

      因为前者的底层会进行一些额外的操作,所以即使将 sb 重新复制给 String,效率也更高。

  4. 关于一些原生的方法:

    • String 实现了 equals() 方法与 hashCode() 方法;

    • StringBufferStringBuilder 并没有实现这两个方法,也就是说:

      1
      2
      3
      
      StringBuffer sb1 = new StringBuffer("Java");
      StringBuffer sb2 = new StringBuffer("Java");
      sb1.equals(sb2); // ==> false
      
  5. 关于是否线程安全:

    • StringBufferStringBuilder 它们都提供了一系列插入追加改变字符串序列的方法,它们的用法基本相同。区别在于 StringBuffer 是线程安全的,而 StringBuilder 是线程不安全的。