层次结构
StringBuffer

StringBuilder

StringBuffer
StringBuffer 是一个线程安全类,它对append()方法做了synchronized处理。
在AbstractStringBuilder中:
1 2 3 4 5 6 7 8 9 10
| public AbstractStringBuilder append(String str){ if(str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value. count); count += len; return this; }
|
StringBuffer和StringBuilder均为AbstractStringBuilder类的实现,我们可以看到方法中执行两个步骤:
- 对追加后的字符串进行长度预判断(此时未将str添加到原对象中),如果现存的value[]长度不满足追加后的长度,则以追加后的字符串长度进行newCapacity()
- 调用String类中的getChars()方法,将字符真正添加到原字符串对象中去。
明显,AbstractStringBuilder.append()方法的操作不满足原子性,所以在多线程环境下可能会导致数组越界异常、结果数据不正确等非与其的问题。StringBuffer采用synchronized进行同步,所以可以保证在多线程环境下的线程安全。
构造函数
1 2 3 4 5 6 7 8 9 10 11
| StringBuffer()
StringBuffer(CharSequece seq)
StringBuffer(int capacity)
StringBuffer(String str)
|
StringBuilder
StringBuilder的原理和StringBuffer一样,不同之处在于StringBuilder不需要考虑线程安全。
构造函数
1 2 3 4 5 6 7 8 9 10 11
| StringBuilder()
StringBuilder(CharSequece seq)
StringBuilder(int capacity)
StringBuilder(String str)
|
常用方法
两者均有以下方法:
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| public StringBuffer append(String s)
public StringBuffer reverse()
public delete(int start, int end)
public insert(int offset, int i)
replace(int start, int end, String str)
String toString()
String substring(int start, int end)
String substring(int start)
CharSequence subSequence(int start, int end)
void setLength(int newLength)
int capacity()
char charAt(int index)
void ensureCapacity(int minimumCapacity)
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
int indexOf(String str)
int indexOf(String str, int fromIndex)
int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex)
int length()
void setCharAt(int index, char ch)
|