String为什么是不可变的?
String的是实现是private final char[] value,所以String对象是不可变的,所以String也就没有线程安全一说,因为它就相当于一个常量。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
而StringBuilder和Stringbuffer是继承自AbstractStringBuilder类,而AbstractStringBuilder的实现是char[] value,所以StringBuilder和Stringbuffer是可变的。
StringBuffer是线程安全的,因为StringBuffer在append、insert、indexOf等方法上都加了同步锁或调用方法的时候加了同步锁,所以是线程安全的;StringBuilder是线程不安全的,因为StringBuilder没有加,所以线程不安全。
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
//StringBuilder
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
@Override
public int indexOf(String str) {
return super.indexOf(str);
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
}
//StringBuffer
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
@Override
public synchronized char charAt(int index) {
if ((index < 0) || (index >= count))
throw new StringIndexOutOfBoundsException(index);
return value[index];
}
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
}