String、StringBuffer、StringBuilder的区别。
可变性
String不可变的原因是因为使用了final关键字定义字符数组保留字符串,private final char[] value;
所以String是不可变的。
具体表现为,无论如何修改String都无法修改到这个字符串本身的值,而是返回一个新的字符串对象。
而StringBuffer和StringBuilder都是继承了AbstractStringBuilder,在AbstractStringBuilder中定于数组value没有使用final关键字,所以这两个对象都是可变的。
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
/**
* The count is the number of characters used.
*/
int count;
/**
* This no-arg constructor is necessary for serialization of subclasses.
*/
AbstractStringBuilder() {
}
…………
}
线程安全性
String对象是不可变的,也就可以理解是String是线程安全的。
上面已知StringBuffer和StringBuilder是共同继承了AbstractStringBuilder类。
不过StringBuffer对方法或者对调用的方法加了同步锁,所以是线程安全的。而StringBuilder没有加同步锁,所以是非线程安全的。
性能方面
String若要修改值,每次都需要重新创建一个对象,然后再将指针指向新的对象,而旧的对象就会留存等待GC清除。StringBuffer和StringBuilder都是在对对象本身进行操作,不会重新再创建新的对象并改变对象引用。
但是StringBuilder比StringBuffer少了一个同步锁,所以StringBuilder会比StringBuffer性能高10%左右,但是却牺牲了线程安全性。如何取舍看各自的项目需求。
总结
- 操作少量数据使用String
- 单线程操作大量数据使用StringBuilder
- 多线程操作大量数据使用StringBuffer
构造函数有哪些特点?是否可被Override?
特点
- 名字和类名相同
- 没有返回值,所以不用使用void声明构造函数
- 生成类的对象时自动执行,无需再次调用
构造方法无法被Override(重写),但是可以被Overload(重载),所以也会看到一个类有多个构造函数的情况。