九、String, StringBuffer, StringBuilder的区别是什么?

125 阅读2分钟

String:不可变字符串;

StringBuffer:可变字符串、效率低、线程安全;

StringBuilder:可变字符序列、效率高、线程不安全;

String是一个对象,从底层源码来看是一个final类型的字符数组,所引用的字符串不能被改变,一经定义,无法增删改,每次对String的操作都会生成新的String对象,但是这样不仅效率低,而且大量浪费有限的内存空间(比如在循环体内使用 += 拼接字符串,因为String类使用 += 拼接的底层其实是使用StringBuilder的, 首先它会先初始化一个StringBuilder对象,然后使用append()方法进行拼接,最后使用toString()方法得到结果, 如果在循环体中使用 += 拼接,就会创建很多临时的StringBuilder对象,拼接后再调用toString()赋给原String对象,这会产生大量的临时对象,占用了更多的内存空间,还会让java虚拟机不停的进行垃圾回收,就会造成程序性能降低)

StringBuffer 和 StringBuilder 他们两都继承了AbstractStringBuilder抽象类,从 AbstractStringBuilder抽象类中我们可以看到

char[] value;

他们的底层都是可变的字符数组,所以在进行频繁的字符串操作时,建议使用StringBuffer和StringBuilder来进行操作。 另外StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

总结:

  1. 如果要操作少量的数据用String;
  2. 多线程操作字符串缓冲区下操作大量数据使用StringBuffer;
  3. 单线程操作字符串缓冲区下操作大量数据使用StringBuilder(推荐使用).