String
public final class String implements Serializable, Comparable
<String>, CharSequence
{
private final char[] value
;
private int hash
;
private static final long serialVersionUID
= -6849794470754667710L
;
private static final ObjectStreamField
[] serialPersistentFields
= new ObjectStreamField[0];
public static final Comparator
<String> CASE_INSENSITIVE_ORDER
= new String.CaseInsensitiveComparator();
AbstractStringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence
{
char[] value
;
int count
;
private static final int MAX_ARRAY_SIZE
= 2147483639;
AbstractStringBuilder() {
}
AbstractStringBuilder(int var1
) {
this.value
= new char[var1
];
}
StringBuilder
public final class StringBuilder extends AbstractStringBuilder implements Serializable, CharSequence
{
static final long serialVersionUID
= 4383685877147921099L
;
public StringBuilder() {
super(16);
}
StringBuffer
public final class StringBuffer extends AbstractStringBuilder implements Serializable, CharSequence
{
private transient char[] toStringCache
;
static final long serialVersionUID
= 3388685877147921107L
;
private static final ObjectStreamField
[] serialPersistentFields
;
public StringBuffer() {
super(16);
}
1 相同点
1.1 StringBuffer 和 StringBuilder 都继承了 AbstractStringBuilder 实现了CharSequence
1.2 String,StringBuffer,StringBuilder 的底层都是用char[ ] 数组实现
1.3 StringBuffer,StringBuilder 字符数组的初始值为16,扩容为2n+2(n为原数组长度)
2 不同点
2.1 String 的底层是final修饰的不可变数组,修改String时实际上是new一个新String对象返回,而StringBuffer和StringBuilder都是可变数组
StringBuffer:线程安全(StringBuffer中的方法中加synchronized锁),修改值时实际上是修改底层的char数组
StringBuilder:非线程安全的(StringBuilder中的方法中没加synchronized锁),修改值时实际上是修改底层的char数组
StringBuffer和StringBuilder 都是继承AbstractStringBuilder, 在其中的大多数操作字符数组的方法都是直接调用父类的方法,区别在于StringBuffer的方法是同步方法(加了synchronize关键字)而StringBuilder并没有加上synchronized 关键字