Java String,StringBuffer和StringBuilder的区别
【可变与不可变】
- String是字符串常量,不可变。
- StringBuffer和StringBuilder是字符串变量,可变。
【执行速度方面】
- StringBuilder > StringBuffer > String (StringBuilder是线程不安全的,StringBuffer是线程安全的)
为什么执行速度StringBuffer一般大于String?
因为String是不可变的对象,如果使用String进行字符串操作,如字符串拼接,会生成很多的中间String对象,这些对象如果不能及时被GC回收器回收,就会一直占用内存,导致程序运行变慢,也就是手机或电脑经常出现的卡机现象。
为什么执行速度StringBuilder大于StringBuffer?
因为StringBuffer是线程安全的,所以对于多线程访问的场景,编译器会对StringBuffer表示的字符串缓冲区进行加锁,所以访问起来会慢一点,看到一个比较形象的解释,就是回家拿东西,当家里有门的时候,需要掏钥匙开锁然后拿东西,当家里没门的时候就可以直接到房间里去拿东西,自然就快了。
【使用场景】
- 在涉及到比较大的数据量,需要使用字符串拼接时,尽量使用StringBuffer和StringBuilder,而不是String,当涉及到较少的数据量时,直接使用String就好。
- 单线程操作字符串缓冲区的大量的数据时用StringBuilder,效率更高;多线程操作字符串缓冲区的大量数据时用StringBuffer,线程更安全。
【备注】
对于使用“+”操作符来拼接字符串,虽然编译器会自动创建StringBuilder(Java SE5引入)对象,来进行优化,但这个优化程度是有限制的,看下面的例子:
public String implicit(String[] fields) {
String result = "";
for (int i = 0; i < fields.length; i++) {
result += fields[i];
}
return result;
}
public String explicit(String[] fields) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < fields.length; i++) {
result.append(fields[i]);
}
return result.toString();
}
对于implicit方法,编译器在每一次进行for循环时都会创建一个StringBuilder对象;而explicit显式地创建一个StringBuilder对象只需要一次,而且在知道目标字符串大小的情况下,还可以指定StringBuilder的大小,这样可以避免多次重新分配缓冲。
Java String,StringBuffer和StringBuilder的区别的更多相关文章
- JAVA String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- Java String, StringBuffer和StringBuilder实例
1- 分层继承2- 可变和不可变的概念3- String3.1- 字符串是一个非常特殊的类3.2- String 字面值 vs. String对象3.3- String的方法3.3.1- length ...
- 【Java】String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- java中String,StringBuffer与StringBuilder的区别??
本文着重介绍下,应该在何时恰当的使用string,stringbuffer,stringbuilder. 1,执行速度 StringBuilder > StringBuffer > ...
- String,StringBuffer与StringBuilder的区别??
转自http://blog.csdn.net/rmn190/article/details/1492013 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBu ...
- 转 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 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
随机推荐
- SpringMVC学习笔记(二)
一.HandleMapping和HandlerAdapter的讲解 HandleMapping:处理映射器,可以理解为为请求的url查找对应的Controller类. HandlerAdapter:可 ...
- Vim特定行行尾追加
python print 替换 logging 1.print语句最后追加")". :%s/\(.*\)print \(.*\)/\1print \2)/g 2." ...
- SQL多表联查
left join >>>外联 on >>>跟and一样使用,作为外联条件 表明后面加大写字母表示该表别名 例: select A.*,B.name userNam ...
- SDF文件的用途
标准延迟格式(英语:Standard Delay Format, SDF)是电气电子工程师学会关于集成电路设计中时序描述的标准表达格式.在整个设计流程中,标准延迟格式有着重要的应用,例如静态时序分析和 ...
- win8.1 64位安装DEV C++
1.首先下载64位版本的DEV C++ http://sourceforge.net/projects/orwelldevcpp/files/Setup%20Releases/ 2.采取默认安装即可, ...
- 【网络编程/C++】修改本机ip地址
昨天学会了编程实现获取本地网卡信息,今天再接再砺学会了修改本机ip地址.其实原理很简单就是用c++调用一下dos命令而已,不得不说,dos命令实在是太强大了,当然听说还有种修改注册表的方法,不过没有试 ...
- VC++ 简单的打印功能(对话框模式下)
不多说,直接上代码 void CParamDlg::OnBnClickedButton6() { // TODO: 在此添加控件通知处理程序代码 CDC dc; CPrintDialog dlg(TR ...
- python求范数
import numpy as npa=np.array([[complex(1,-1),3],[2,complex(1,1)]]) print(a)print("矩阵2的范数" ...
- 循序渐进Python3(十一) --0-- web之html
HTML: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记). 相当于定义统一的一套规则,大家都来遵守他,这样就可以 ...
- Rust的几个预测
写程序多年,语言也用过不下十种,对于Rust有种亲人的感觉,就像在梦中见到过似的.现在对于Rust特做出以下一些预测,希望Rust会有更大的影响力. 1. 当前的Rust的核心功能现以比较稳定,可以用 ...