String、StringBuffer与StringBuilder之间区别
来源:互联网 发布:论坛源码php源码 编辑:程序博客网 时间:2024/06/06 16:14
转自:http://blog.csdn.net/posonrick/article/details/52554339
执行速度
执行速度方面三者有如下关系: StringBuilder>StringBuffer>String;
分析原因
1.String执行速度慢于StringBuilder与StringBuffer原因:
- String 是字符常量;
- StringBuilder 是字符变量;
- StringBuffer 是字符变量;
从三者的源码定义不难发现,String是字符常量,也就是说是final类型的,是不可改变的,这里可能大家心里会有疑问了,先来看下下面的代码:
- 1
- 2
可能大家平时代码里经常这么写,问题来了,不是说String是字符常量吗?不是不能修改它的值吗?
其实是JVM的一种变相处理方式,可以看作是一种“欺骗”,对于上面两行代码JVM是这样处理的,先创建一个常量ss,并对它进行赋值dotest,然后当执行ss=ss+”addstr”时,JVM会临时再创建一个变量ss,并为它赋值dotest+addstr,之前的ss会通过垃圾回站GC进行回收进而释放内存。
而StringBuilder与StringBuffer则不同,它们是字符变量,对他们赋值,即是在同一个对象上进行操作,不存在GC回收,新对象创建等操作,现在可以理解为什么String为什么比StringBuilder与StringBuffer执行效率低了吧。
特殊的例子
- 1
- 2
这个例子可以发现用ss生成很快,完全看不出用StringBuffer有什么效率方面的优势,其实了解下JVM对上面两句话的执行方式就会明白原因:
- 1
实际上JVM会以 String ss = “this is my first demo!”;来执行。
如果换下面的写法就能体现出速度差异了:
- 1
- 2
- 3
- 4
这时JVM就会规规矩矩按上面分析到的方式进行处理。
StringBuffer与StringBuilder
StringBuffer 是线程安全的;
StringBuilder 是非线程一安全的;
当我们的字符缓冲区被多个线程使用时,JVM不能保证StringBuilder 操作是安全的,虽然速度是最快的,但是可以保证StringBuffer 的操作是安全的,不过大多情况下我们都是单线程在操作字符缓冲区,因此大多建议使用StringBuilder 的情况下就只是因为速度的原因。
总结
对于以上三者的使用情况简单总结如下:
- 如果少量的字符串操作采用String;
- 如果单线程下操作大量字符串采用StringBuilder ;
- 如果多线程下操作大量字符串采用StringBuffer ;
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String 、StringBuffer、与StringBuilder之间的区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- Java--String、StringBuffer与StringBuilder之间区别
- 密码学1
- java中instanceof的用法
- RMI 说明
- 练习 2-4 squeeze(s1, s2),将字符串 s1 中任何与字符串 s2 中字符匹配的字符 都删除
- 例2.2
- String、StringBuffer与StringBuilder之间区别
- 计网TCP连接中的3次握手
- 今日收获:匿名函数 Lambda
- 操作符
- 容器化
- 第五章 树和二叉树翻转学习任务
- python绘制规则网络图形
- 1.1 JAVA语言的特点
- HDU-1087 Super Jumping! Jumping! Jumping!(DP)