String、StringBuffer和StringBuilder的区别
可变性
- String是不可变的,它使用final关键词修饰--
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
...................
- StringBuffer和StringBuilder两者都是继承自AbstractStringBuilder,AbstractStringBuilder也是用字符数组保存char value[]当时没有用final修饰,所以这两种对象是可变的
public final class StringBuffer
extends AbstractStringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
线程安全性
- String的对象不可变,也就是常量,所以线程安全
- StringBuffer重写了AbstractStringBuilder的方法,比如append、insert等并且加了同步锁,所以是线程安全的
@Override
public synchronized int length() {
return count;
}
@Override
public synchronized int capacity() {
return value.length;
}
@Override
public synchronized void ensureCapacity(int minimumCapacity) {
super.ensureCapacity(minimumCapacity);
}
- 而StringBuilder就没加同步锁,所以是非线程安全的
性能
每次修改String的值都会重新生成一个新的String对象,然后再将指针指向新的String对象,StringBuffer和StringBuilder每次都是对象本身进行操作,而不是生成新的对象。StringBuilder的性能会比StringBuffer好一点,不过却要冒多线程不安全的风险
总结
- 数据量将多用String
- 单线程操作大量数据用StringBuilder
- 多线程操作大量数据用StringBuffer
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。