String、StringBuffer、StringBuilder的区别

String、StringBuffer、StringBuilder

这三种都可以用来处理字符串,可以从可变性、线程安全性以及性能几个方面来进行比较。

1.可变性

String类中使用final关键字修饰字符数组来保存字符串:

1
private final char value[];

所以String对象是不可变的。而StringBufferStringBuilder都继承自AbstractStringBuilder类,其中也是使用字符数组来保存字符串char[] value但是没有用final进行修饰,因此是可变的。

2.线程安全性

String的对象是不可变的,可以理解为常量,线程安全。AbstractStringBuilderStringBufferStringBuilder的公共父类,定义了一些字符串的基本操作,如expandCapacityappendinsertindexOf等公共方法。StringBuffer对方法或者对调用的方法加了sychronized同步锁,所以是线程安全的,而StringBuilder并没有加锁,所以是非线程安全的。

3.性能

每次对String类型进行改变时都会生成一个新的String对象,然后将指针指向新的String对象;StringBufferStringBuilder每次都会对StringBuffer或者StringBuilder对象本身进行操作,并不会生成新的对象改变对象引用,但是由于加锁和不加锁的区别导致StringBuffer的性能比StringBuilder略低。

三者的使用总结

  • 操作少量的数据适用String
  • 单线程下操作字符串缓冲区下操作大量数据适用StringBuilder
  • 多线程下操作字符串缓冲区下操作大量数据适用StringBuffer
Java String