String,StringBuffer和StringBuilder的区别
面试的时候经常问到的一个题:这里先说明下三者在JVM中的执行速度:StringBuilder > StringBuffer > String,原因且看下面慢慢阐述。
首先看一个概念,为啥一个是常量,另外两个是变量,详细可见JDK中源码的修饰符。
String:字符串常量
StringBuilder:字符串变量
StringBuffer:字符串变量
首先看一段简单的代码:这段代码看似简单,实际上很多人不懂JVM执行的原理,首先JVM创建了str的对象,并赋予了"abc"的值,而后再次创建一个新的str的对象,并由原先的str对象拼接上 "d",最终赋值为"abcd",而原先的str的对象则被垃圾回收掉了。看JDK的源码可知,String类的修饰符是final的,所以对象是无法被修改的,因此每次对String对象的切割,拼接等操作,实际上new出了很多对象,所以这样的原因导致了操作String的速度变慢。
String str = "abc";
str = str + "d";
但StringBuilder和StringBuffer不一样,他们是字符串变量,是可变的对象,每次对他们的操作都是在一个对象上操作的,所以速度自然就变快了。
StringBuilder和StringBuffer的比较:
StringBuilder是线程不安全的,而StringBuffer是线程安全的。何为线程安全?
线程安全:如果你的程序是一个进程中运行的,而该进程中跑着多个线程,并且可能同时操作该部分相同的程序,若每次运行的结果和单线程执行的结果相同,并且变量值和预 期的结果也是相同的,那么称之为线程安全。
结论
对三者的使用建议如下:对少量的字符串数据操作使用String
单线程场景下操作大量的字符串数据使用StringBuilder,因为速度最快。
多线程场景下操作大量的字符串数据使用StringBuffer,因为线程安全。
String,StringBuffer和StringBuilder的区别的更多相关文章
- String,StringBuffer与StringBuilder的区别??
转自http://blog.csdn.net/rmn190/article/details/1492013 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBu ...
- JAVA String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- 转 String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- String,StringBuffer与StringBuilder的区别??[转]
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- 【Java】String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- String,StringBuffer与StringBuilder的区别?? 缓存
转: String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主 ...
- 《转》String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- (转)String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- String,StringBuffer与StringBuilder的区别与选择
三者的区别 String:不可变类,一旦一个对象被建立的时候,包含在这个对象中的字符串序列是不可变的,直到这个对象被销毁.StringBuffer:可变字符序列的字符串.当其对象被创建的时候,可以用a ...
- String,StringBuffer和StringBuilder的区别
(1)String类的API概述是这样的:String类代表字符串,Java程序中的所有字符串字面值都作为此类的实例体现.字符串是常量,它们的值在创建之后不能更改.可见,String是对象且为不可变对 ...
随机推荐
- 容斥 + 组合数学 ---Codeforces Round #317 A. Lengthening Sticks
Lengthening Sticks Problem's Link: http://codeforces.com/contest/571/problem/A Mean: 给出a,b,c,l,要求a+x ...
- 集中精力的重要性(The Importance of Focus)
集中精力的重要性(The Importance of Focus) 在当今激烈竞争的经济中,你需要集中精力使得你公司的独特方面精益求精.并且你需要每天将精力集中在改进你的公司上.通过终极外包,单干型企 ...
- 011杰信-创建购销合同Excel报表系列-4-建立合同货物(修改,删除):合同货物表是购销合同表的子表
前面的一篇文章做的是修改删除,这篇文章做的是合同货物的修改和删除. 业务功能如下:
- Mybatis实现了接口绑定,使用更加方便。
1.Mybatis实现了接口绑定,使用更加方便. 在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生 ...
- c++开发之对应Linux下的sem_t和lock
http://www.cnblogs.com/P_Chou/archive/2012/07/13/semaphore-and-mutex-in-thread-sync.html http://blog ...
- HMCharacteristicType 承接homekit 外包开发 微信 ELink9988
承接homekit 开发 微信 ELink9988 让HMCharacteristicTypePowerState:String配件的电源状态.该值是一个布尔值.让HMCharacteristicTy ...
- angularJs上传文件(非form上传)
angular.js:13920 Broken interceptor detected: Config object not supplied in rejection: <input typ ...
- Object Slicing in C++
In C++, a derived class object can be assigned to base class, but the other way is not possible. cla ...
- Ubuntu执行su后输入密码结果认证失败--解决办法:sudo passwd修改命令
- 在Eclipse中显示.project和.classpath和.setting目录
在Eclipse中显示.project, .classpath, .gitignore文件和.setting文件夹 在Eclipse中使用git,并显示.gitigonre文件,进行项目管理 在Ecl ...