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

小白学习之路(一):stringbuilder ,stringbuffer,string区别

2015-06-22 22:52 513 查看
个人学习记录,如有错误,欢迎大家纠正。

最近在看jdk源码,发现stringbuilder和stringbuffer的方法大多数都类似,且都继承了AbstractStringBuilder类。一时比较混乱,弄不清楚两者区别与联系。于是从网上看了其他人的指导,有自己的理解。

stringbuffer 和stringbuilder都是常用的对字符串操作的类,通过读源码可知,其根本还是对一字符数组进行一系列操作(String类实际上也是如此)。而他们之间的一些区别就是在有些同名的方法如append,方法体都是调用父类AbstractStringBuilder类的append方法,但是在stringbuffer的append方法方法签名有synchronized保留字,意味着每次只有一个线程能进入这个方法执行,因此保证了stringbuffer类的append方法的线程安全性。其他方法也同理。

也就是说stringbuffer类是线程安全的,stringbuilder类是线程不安全的。但是也由于synchronized保留字,这样降低了stringbuffer操作的速度。因此就操作速度而言,stringbuilder>stringbuffer

可以写个简单的小测试例子,生成3个线程对同一个stringbuilder对象进行append操作,线程1执行1000次append("1");线程2执行1000次append("2")线程3执行1000次append("3").....最后得到的stringbuilder对象调用toString()方法,统计里面的1,2,3的个数。理论上应该均为1000个,但由于多线程,而stringbuilder又是线程不安全的,所以结果不是预计的那样,得到的字符串会存在空白符“ ”..这是就是线程不安全造成的结果。。

由stringbuffer和stringbuilder我们很容易想到我们常用的String类,String类有个特点,每次执行String str = "Hello"; str = "World"..实际上每个赋值操作都是新建了一个String 对象,所以可想而知,String类是线程安全的。但是也容易想到,每次赋值都新生成一个对象,这样的速度肯定会大大降低。因此,从速度上来看,StringBuilder>StringBuffer>String
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: