java String和StringBuilder、StringBuffer浅谈
2016-03-07 15:49
423 查看
java面试中经常会问到这两者之间的区别,学习记录一下。
基本概念:
String
String是对象而不是原始类型,它是个final类,不能被继承,同时它也是不可变对象,一旦创建一个String对象就不能修改它的值。我们平常对于String的修改都是重新创建一个新的对象,然后把新的值保存进去的。
StringBuffer
StringBuffer是一个可变的对象,对它进行修改的时候不会像String那样重新创建一个对象。
StringBuilder
StringBuilder和StringBuffer一样,都是一个可变的对象,对它进行修改的时候不会像String那样重新创建一个对象。那StringBuffer和StringBuilder有啥区别呢?他们最大的区别就是:StringBuilder的方法不是线程安全的(不能同步访问)。
注:
1、由于StringBuilder相较于StringBuffer有速度优势,所以多数情况下建议使用StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。
2、java中的线程安全(来自百度)
就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问
什么叫线程安全:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
使用策略:
1、如果是操作少量的数据,可以使用String,如果是在单线程下操作大量数据,则用StringBuilder,如果是在多线程下,则使用StringBuffer(线程安全)。
2、不要使用String类的“+”进行频繁的连接操作,应该使用
应该使用StringBuffer或StringBuilder类的append()操作,这在Java的优化上是一条比较重要的原则。
3、相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15%
左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在
StringBuffer
上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder;否则还是用StringBuffer。
参考资料:
1、http://blog.csdn.net/kingzone_2008/article/details/9220691
2、http://pengcqu.iteye.com/blog/487538
3、http://www.runoob.com/java/java-stringbuffer.html
基本概念:
String
String是对象而不是原始类型,它是个final类,不能被继承,同时它也是不可变对象,一旦创建一个String对象就不能修改它的值。我们平常对于String的修改都是重新创建一个新的对象,然后把新的值保存进去的。
StringBuffer
StringBuffer是一个可变的对象,对它进行修改的时候不会像String那样重新创建一个对象。
StringBuilder
StringBuilder和StringBuffer一样,都是一个可变的对象,对它进行修改的时候不会像String那样重新创建一个对象。那StringBuffer和StringBuilder有啥区别呢?他们最大的区别就是:StringBuilder的方法不是线程安全的(不能同步访问)。
注:
1、由于StringBuilder相较于StringBuffer有速度优势,所以多数情况下建议使用StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。
2、java中的线程安全(来自百度)
就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问
什么叫线程安全:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
使用策略:
1、如果是操作少量的数据,可以使用String,如果是在单线程下操作大量数据,则用StringBuilder,如果是在多线程下,则使用StringBuffer(线程安全)。
2、不要使用String类的“+”进行频繁的连接操作,应该使用
应该使用StringBuffer或StringBuilder类的append()操作,这在Java的优化上是一条比较重要的原则。
3、相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15%
左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在
StringBuffer
上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder;否则还是用StringBuffer。
参考资料:
1、http://blog.csdn.net/kingzone_2008/article/details/9220691
2、http://pengcqu.iteye.com/blog/487538
3、http://www.runoob.com/java/java-stringbuffer.html
相关文章推荐
- error: The requested URL returned error: 401 Unauthorized while accessing
- iOS mask 层 UIBezierPath path 放大
- require或include相对路径多层嵌套引发的问题
- UISegmentedControl设置样式(圆角,边框颜色)
- UITabBarItem title 和self.title设置不同的标题
- poj 2478 Farey Sequence(欧拉函数)
- iOS Core Animation Advanced Techniques的学习笔记(五)
- Requests模块官方文档
- iOS 点击键盘return按钮 文本框UiTextField 自动换行
- 《iOS Human Interface Guidelines》——Toolbar Bar
- workqueque 使用例子
- 413 Request Entity Too Large错误解决办法
- autoLayout cell中添加UILabel 多行显示问题
- 自定义UITableViewCell上的delete按钮
- 收藏文章 写的很好 可惜有些还是看看不懂额。。。RequireJS进阶:模块的定义与加载
- 【性能优化】【UI】性能优化之ListView
- [LeetCode]96. Unique Binary Search Trees
- 理解的主线程刷新UI:
- guid 新建
- easyui combobox开启搜索自动完成功能