String StringBuffer StringBuilder区别

1. 可变性

  • String 不可变:

查看源码发现,String 类中使用 final 关键字修饰字符数组来保存字符串

    /** The value is used for character storage. */
    private final char value[];

String类是不可变类,任何对String的改变都会引发新的String对象的生成;

如果是String的字符串拼接

String str = str1 + str2;

如果使用反编译的话,可以看到,String拼接用的是StringBuilder.append。


  • StringBuffer 和 StringBuilder 可变

StringBuffer 和 StringBuilder 类都是继承AbstractStringBuilder类, AbstractStringBuilder里面没有用final关键字修饰字符数组来保存字符串。

2. 线程安全

  • String 不可变,因此是线程安全的
  • StringBuilder 不是线程安全的
  • StringBuffer 是线程安全的,内部使用 synchronized 进行同步

StringBuffer和StringBuilder之间的区别在于StringBuffer是线程安全的。 因此,当应用程序只需要在单个线程中运行时,最好使用StringBuilder。 StringBuilder比StringBuffer更有效。

String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

3.性能

每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

对于三者使用的总结:

  1. 操作少量的数据: 适用String
  2. 单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder
  3. 多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer

你可能感兴趣的:(Java)