谈谈StringBuffer和StringBuilder
来源:互联网 发布:网络犯罪的典型案例 编辑:程序博客网 时间:2024/06/06 07:41
谈谈StringBuffer和StringBuilder
(1) 速度
在执行速度方面的比较:StringBuilder > StringBuffer > String
①String 是不可变的对象(String类源码中存放字符的数组被声明为final), 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
② StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了。
③在某些特别情况下,String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率要比 StringBuffer 快:
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb =
new
StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”;
其实就是:
String S1 = “This is only a simple test”;
所以当然不需要太多的时间了。
(2)线程安全性
StringBuilder:线程非安全的
StringBuffer:线程安全的
StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。
当我们在字符串缓冲区被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。
当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
(3)使用策略
1.如果要操作少量的数据用 = String
单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
2. 不要使用String类的"+"来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。
(4)速度测试源码
我们测试下拼接N条UUID的耗时
①N等于3W
String方法耗时:26765ms
StringBuffer方法耗时:27ms
StringBuilder方法耗时:24ms
②N等于300W
StringBuffer方法耗时:3337ms
StringBuilder方法耗时:2768ms
测试代码
public
class
TestDemo {
public
static
void
main(String[] args) {
Long start = System.currentTimeMillis();
//①String方法拼接字符串
String str1 = UUID.randomUUID().toString();
int
n =
30000
;
for
(
int
i =
0
; i < n; i++) {
str1 = str1 + UUID.randomUUID().toString();
}
System.out.print(
"String长度:"
+str1.length());
System.out.println(
" String拼接耗时:"
+(System.currentTimeMillis() - start)+
"ms"
);
start = System.currentTimeMillis();
//②StringBuffer方法拼接字符串
StringBuffer sBuffer =
new
StringBuffer();
for
(
int
i =
0
; i <= n; i++) {
sBuffer.append(UUID.randomUUID().toString());
}
System.out.print(
"String长度:"
+sBuffer.toString().length());
System.out.println(
" StringBuffer拼接耗时:"
+(System.currentTimeMillis() - start)+
"ms"
);
start = System.currentTimeMillis();
//②StringBuilder方法拼接字符串
StringBuilder sBuilder =
new
StringBuilder();
for
(
int
i =
0
; i <= n; i++) {
sBuilder.append(UUID.randomUUID().toString());
}
System.out.print(
"String长度:"
+sBuilder.toString().length());
System.out.println(
" StringBuilder拼接耗时:"
+(System.currentTimeMillis() - start)+
"ms"
);
}
}
- 谈谈StringBuffer和StringBuilder
- String 、StringBuffer 和 StringBuilder
- String、StringBuffer和StringBuilder
- String、StringBuffer和StringBuilder
- String、StringBuffer和StringBuilder
- StringBuffer 和 StringBuilder比较
- StringBuffer 和 StringBuilder
- String、StringBuffer和StringBuilder
- 浅析StringBuilder和StringBuffer
- String Stringbuffer和StringBuilder
- StringBuffer和StringBuilder区别
- stringBuffer 和stringBuilder
- String ,StringBuffer和StringBuilder
- StringBuilder和StringBuffer
- StringBuffer和StringBuilder区别
- String、StringBuffer和StringBuilder
- StringBuffer和StringBuilder
- StringBuffer和StringBuilder
- tableHeaderView和headerView的区别。
- powerdesigner反向SQLServer2008数据库生成物理数据模型
- 下拉列表选择联动-ajax
- iphone开发中NSMutableAttributedString/NSAttributedString 富文本设置
- 文件类型判断:doc/dot
- 谈谈StringBuffer和StringBuilder
- 关系型数据库理论
- 点击 获取验证码 后,btn上显示 60秒 倒计时
- ios 导航栏 说明
- document.forms[0].
- 服务端使用3DES解密,客户端使用3DES加密
- EasyAR从入门到精通开发系列教程(2)--创建模型并互动
- SQL Server 中添加表注释
- $.ajax返回的JSON格式的数据后无法执行success的解决方法