Stringbuffer与Stringbuilder源码学习和对比
>>String/StringBuffer/StringBuilder的异同
(1)相同点
观察源码会发现,三个类都是被final修饰的,是不可被继承的。
(2)不同点
String的对象是不可变的;而StringBuilder和StringBuffer是可变的
查看源码可以发现,StringBuffer的实现都添加了Synchronized同步,因此StringBuffer是线程安全的,而StringBuilder不是线程安全的
String中的offset,value,count都是被final修饰的不可修改的;而StringBuffer和StringBuilder中的value,count都是继承自AbstractStringBuilder类的,没有被final修饰,说明他们在运行期间是可修改的,而且没有offset变量。
>>StringBuffer/StringBuilder源码学习
String底层是一个char数组:
private final char value[];
同样,StringBuffer/StringBuilder都继承了AbstractStringBuilder,
底层的实现也是通过一个char型数组:
char[] value;
它们的默认构造方法都是初始化一个长度为16的字符数组,
public StringBuilder() {
super(16);
}
public StringBuilder() {
super(16);
}
或者使用传入的容量进行初始化:
public StringBuilder(int capacity) {
super(capacity);
}
public StringBuffer(int capacity) {
super(capacity);
}
再具体的实现就不去看了,有用到再研究。
>>使用举例
贴一个以前学习Java的例子,
String s1 = “hello”;
s1=“world”;
这个操作其实是:其实是创建了两个String对象。
String s2 = "hello"
s2 += "world";
这操作是:先创建一个String对象,在接下来进行字符串连接的时候,有创建了一个StringBuilder(jdk1.5前是StringBuffer),然后调用append()方法,最后调用toString()方法。
有此可以看出String对字符的操作比直接使用Stringbuffer(或者StringBuild)要多出附加的操作,而且String是不可变对象,使用String对字符串操作会产生大量的、多余java对象。所以结果是:影响性能,占用空间。
举例:
分别使用String和StringBuffer对字符串“0123456789”累加10000次,然后统计耗时多长:
String str = "0123456789";
String str2 = "";
int count = 10000;
long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
str2 += str;
}
long end = System.currentTimeMillis();
long time = (end - start);
System.out.println(time);
运行多次,在我的机器上平均时间约等于3300,即3.3秒,下面用StringBuffer来操作,查看结果
String str = "0123456789";
StringBuffer sb = new StringBuffer();
int count = 10000;
long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
sb.append(str);
}
String str2 = sb.toString();
long end = System.currentTimeMillis();
long time = (end - start);
System.out.println(time);
同样在我的机器上结果平均结果小于10,即0.01秒,两者相差300多倍,而且随着循环次数的增加这个差距逐渐增大 。
Stringbuffer与Stringbuilder源码学习和对比的更多相关文章
- String,StringBuffer和StringBuilder源码解析[基于JDK6]
最近指导几位新人,学习了一下String,StringBuffer和StringBuilder类,从反馈的结果来看,总体感觉学习的深度不够,没有读出东西.其实,JDK的源码是越读越有味的.下面总结一下 ...
- String、StringBuffer、StringBuilder源码解读
序 好长时间没有认真写博客了,过去的一年挺忙的.负责过数据库.线上运维环境.写代码.Code review等等东西挺多. 学习了不少多方面的东西,不过还是需要回归实际.加强内功,方能扛鼎. 去年学习M ...
- String、StringBuffer、StringBuilder源码分析
利用反编译具体看看"+"的过程 1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 int ...
- StringBuffer 和Stringbuilder源码分析
首先看一下他们的继承关系 这个两个对象都继承了AbstractStringBuilder抽象类. 1.他们的实现方式都一样的,唯一区别的StringBuffer在多线程的时候是保证了数据安全, ...
- String、StringBuffer和StringBuilder源码解析
1.String 1.1类的定义 public final class String implements java.io.Serializable, Comparable<String> ...
- JDK源码学习系列03----StringBuffer+StringBuilder
JDK源码学习系列03----StringBuffer+StringBuilder 由于前面学习了StringBuffer和StringBuilder的父类A ...
- [源码]String StringBuffer StringBudlider(2)StringBuffer StringBuilder源码分析
纵骑横飞 章仕烜 昨天比较忙 今天把StringBuffer StringBulider的源码分析 献上 在讲 StringBuffer StringBuilder 之前 ,我们先看一下 ...
- String,StringBuffer,StringBuilder源码分析
1.类结构 String Diagrams StringBuffer Diagrams StringBuilder Diagrams 通过以上Diagrams可以看出,String,StringBuf ...
- JDK源码学习系列02----AbstractStringBuilder
JDK源码学习系列02----AbstractStringBuilder 因为看StringBuffer 和 StringBuilder 的源码时发现两者都继承了AbstractStringBuil ...
随机推荐
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- 高德地图3D版的使用方法
坐标拾取器: http://lbs.amap.com/console/show/picker 其经纬度与LatLng()方法中的经纬度是对调的 SDK和实例下载: http://lbs.amap.co ...
- ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法
ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2015-02-11 中文名乱码是因为:FCKed ...
- Spring依赖注入:注解注入总结
更多11 spring 依赖注入 注解 java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...
- 多线程 用户级线程和内核级线程 from C++多核高级编程
转 http://book.51cto.com/art/201006/206946.htm 6.1.1 用户级线程和内核级线程 2010-06-21 20:37 齐宁/董泽惠 译 清华大学出版社 字号 ...
- oracle的主键
1.关于主键:在建表时指定primary key字句即可:create table test( id number(6) primary key, name varchar2(30));如果是对于已经 ...
- C++ 模板双向不循环链表!!
CTDChain<T,sort,equal,pointer> * nodeTemp = NULL; -------------------------------------------- ...
- win7能上网,上网图标显示红叉的解决办法
今天笔记本开机,发现电脑可以上网,但是上网图标显示红叉,看这很不爽,在网上搜了解决版本. 其实很简单,你按照下面步骤操作即可. 1,右击小图标,打开网络和共享中心. 2,更改适配器设置 把无用的无线都 ...
- 如何在WordPress中使用七牛云存储
序:七牛云存储可以方便的将网站的图片等数据镜像到七牛云存储的空间,直接从云端将数据返回给用户.这样可以大大节省网站的空间,提升网站的访问速度. 真正显示一键实现WordPress博客静态文件CDN加速 ...
- DateTime季度的计算
//获取本季度的第一天 DateTime.Now.AddMonths(0 - (DateTime.Now.Month - 1) % 3).ToString("yyyy-MM-01" ...