String、StringBuffer和StringBuilder区别
说区别之前先说下final。final是java中的修饰符,可以修饰类、方法和变量。
final修饰的类不可以被继承,final类中所有的成员方法都会隐式的定义为final方法。
final修饰的方法不能被重写。
final 修饰的变量即成为常量,只能赋值一次,但是 final 所修饰局部变量和成员变量有所不同。
final 修饰的局部变量必须使用之前被赋值一次才能使用。
final 修饰的成员变量在声明时没有赋值的叫“空白 final 变量”。空白 final 变量必须在构造方法或静态代码块中初始化。
好了,现在言归正传。String、StringBuilder、StringBuffer三者的区别可以从四个方面来回答
1.可变性
String类中有一个byte[ ] 数组,这个byte[ ]数组采用了final修饰,因为数组一旦创建长度不可变。并且被final修饰的引用一但指向某个对象之后,不可在指向其他对象,所以String是不可变的!
StringBuffer和StringBuilder内部实际上是一个byte[ ]数组,这个byte[ ]数组没有被final修饰。StringBuffer、StringBuilder的初始化容量是16当存满之后会进行扩容,底层调用了数组拷贝的方法System.arraycopy() 扩容的。所以StringBuffer、StringBuilder适合用于字符串的频繁拼接操作。
2.线程安全性
String是不可变的所以是线程安全的,StringBuffer被synchronized修饰所以也是线程安全的,StringBuilder在多线程下是不安全的。
所以多线程字符串的频繁拼接用StringBuffer,单线程频频繁拼接用StringBuilder,单线程极少的对字符串操作可用应String的拼接。
3.性能方面
String每次都需要new一个对象,比较耗资源所以性能最差。StringBuffer性能高于String,因为他的可变性不需要额外创建新的对象。性能最好的是StringBuilder,因为StringBuffer有同步锁,同步锁会对性能产生产生影响。
4.存储方面
String存储在常量池中,StringBuffer和StringBuilder存储在堆内存上因为他们都是被new出来的。