您的位置:首页 > 产品设计 > UI/UE

Java StringBuilder & StringBuffer 源代码分析

2016-03-04 20:23 417 查看
从资料来看都知道从操作效率比较的话,StringBuilder > StringBuffer >String. 原因是为什么呢?

StringBuilder 不是线程安全的,StringBuffer 是线程安全的,String是不可变的,操作起来会创建新对象。

下面来看看源代码的分析,

首先StringBuffer和StringBuilder都继承自AbstractStringBuilder 类,这个类完成了大部分字符串的操作,其主要的字段是个字符数组,char[] value. 在使用append方法时,主要是对字符串进行copy到一个新的字符数组。源代码如下:

public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0)
expandCapacity(minimumCapacity);
}
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}


从这段代码来看append方法实现,其原理就是首先确保字符数组长度足够,如果不够的话,会扩充容量,容量的增加一般是(value.length+1)*2。这里为什么加1,目前没想明白。

这个类把常用的操作都实现了。StringBuilder和StringBuffer都继承了这个类,那么StringBuffer类呢,继承后都重新定义了相同名字的方法,并且是synchronized的方法。然后调用了父类的方法。以append方法为例:

public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}


StringBuilder类呢?也定义了相同名字的方法,只是简单的调用父类方法,并没有加锁。

public StringBuilder append(String str) {
super.append(str);
return this;
}


这就是StringBuffer类和StringBuilder的区别。同步方法和没有同步的方法。实现逻辑都完全一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 源代码