String与StringBuilder源码分析

StringBuilder 与 String源码解析

1. StringBuilder是线性不安全的,而String是线性安全的

解析:StringBuilder是 char[] 但是没有synchronize修饰,因此StringBuilder是线性不安全的,而String是 final char[],因此无论什么情况都不能对String进行修改,因此String是线性安全的。

2. StringBuilder内部结构(AbstractStringBuilder)

1
2
3
4
5
6
asbtract class AbstractStringBuilder{
//表示StringBuilder可用的全部范围(线性不安全)
char [] value;
//表示StingBuilder现在已占用的字符数量
int count;
}

2. Stringbuilder继承于AbstractStringBuilder

StringBuilder 常用方法:

  1. length() 返回StringBuilder已用的长度
  2. capacity() 返回StringBuilder的空间长度
  3. charAt( int index ) 返回在index位置的字符
  4. setCharAt(int index , char c)index位置上的字符改为 c
  5. append(Object obj):在StringBuilder上添加obj对象转换成String类型然后添加到StringBuilder上.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public AbstractStringBuilder append(Object obj){
return append(String.valueOf(obj);
}

public AbstractStringBuilder append(String str){
if(str == null || str.length() == 0){
return appendNull();
}
int len = str.length();
ensureCapacityInternal(count + len);
//将str复制到StringBuilder 的 value里
str.getChars(0 , len , value , count);
count += len;
return this;
}

public void ensureCapacity(int minimumCapacity){
if(minimumCapacity - value.length > 0){
value = Arrays.copyOf(value , newCapaticy(minimumCapacity));
}
}

public int newCapacity(int minCapacity){
int newCapacity = (value.length << 1) +2;
if(newCapacity - minCapacity < 0){
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0 ) ? hugeCapacity(minCapacity) : newCapacity;
}

public int hugeCapacity(int minCapacity){
if(Integer.MAX_VALUE - minCapacity < 0){
throw new OutOfMemoryError();
}
return (minCapacity > MAX_ARRAY_SIZE) ? minCapacity : MAX_ARRAY_SIZE;
}