先看一下JDK1.8源码:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];//这里用的是final char数组
private int hash;
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
private transient char[] toStringCache;
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;//这里是char 数组
int count;
从类的继承关系可以看出,StringBuilder和StringBuffer继承同一个父类,但是StringBuffer方法都是同步方法,所以StringBuffer是线程安全的,StringBuffer不是线程安全的。
String类内部是用的final char数组存的
,所以String具有不变性,被叫做String常量,存在方法区中。
看一下构造函数:
public StringBuffer() {
super(16);
}
public StringBuffer(int capacity) {
super(capacity);
}
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
public StringBuilder() {
super(16);
}
public StringBuilder(int capacity) {
super(capacity);
}
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
public StringBuilder(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
从构造函数中看出,这两者都多申请了16个空间大小。