1.String
String中使用final char value[]来存储字符串,所以String字符串是不可变的
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
...
...
}
2.StringBuffer
StringBuffer 继承自 AbstractStringBuilder 而与String不同的是,AbstractStringBuilder中使用char value[] 保存字符串,没有final修饰
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence {
...
}
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
...
}
3.StringBuilder
StringBuilder 和StringBuffer一样继承自AbstractStringBuilder,内部使用char value[]数组保存字符串。
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence {
...
}
4.线程安全方面
String中使用final char value[]保存字符串可以认为是线程安全的。
StringBuffer中每一个方法都是用synchronize关键字进行了修饰,保证了线程安全,可被多个线程安全的使用。
StringBuilder没有对方法添加同步锁,所以是非线程安全的。
5.性能方面
String 每次对String进行改变都会生成一个新的对象,然后将指针指向新的String对象。
StringBuffer每次都会对StringBuffer对象本身进行操作,不会产生新的对象。
StringBuilder没有进行线程同步,性能自然会有提高,据说高不哪去。
6.使用场景总结
操作少量数据:String
多线程操作大量数据的字符串缓冲区:StringBuffer
单线程操作大量数据得字符串缓冲区:StringBuilder