Java StringBuilder & StringBuffer 源代码分析
2016-03-04 20:23
417 查看
从资料来看都知道从操作效率比较的话,StringBuilder > StringBuffer >String. 原因是为什么呢?
StringBuilder 不是线程安全的,StringBuffer 是线程安全的,String是不可变的,操作起来会创建新对象。
下面来看看源代码的分析,
首先StringBuffer和StringBuilder都继承自AbstractStringBuilder 类,这个类完成了大部分字符串的操作,其主要的字段是个字符数组,char[] value. 在使用append方法时,主要是对字符串进行copy到一个新的字符数组。源代码如下:
从这段代码来看append方法实现,其原理就是首先确保字符数组长度足够,如果不够的话,会扩充容量,容量的增加一般是(value.length+1)*2。这里为什么加1,目前没想明白。
这个类把常用的操作都实现了。StringBuilder和StringBuffer都继承了这个类,那么StringBuffer类呢,继承后都重新定义了相同名字的方法,并且是synchronized的方法。然后调用了父类的方法。以append方法为例:
StringBuilder类呢?也定义了相同名字的方法,只是简单的调用父类方法,并没有加锁。
这就是StringBuffer类和StringBuilder的区别。同步方法和没有同步的方法。实现逻辑都完全一样。
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树