为什么StringBuffer的append方法比“+”高效?

dagouaofei 2010-03-06 05:52:08
如题,知其然,更想知其所以然,希望能从根本上了解原因。
为什么StringBuffer的append方法比“+”高效?
...全文
921 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
history1 2010-04-05
  • 打赏
  • 举报
回复
在每次String “+”时,JVM源码中并不是new String对象,而是new Stringbuffer 对象
每加一次 ,创建个新对象,所以占空间。
对于通过循环拼接字符串时,建议使用Stringbuffer。
francis911 2010-03-08
  • 打赏
  • 举报
回复
顶啊,顶啊,
做个试验,效果明显
dinghun8leech 2010-03-08
  • 打赏
  • 举报
回复
引用 15 楼 bao110908 的回复:
在这个帖子 42 楼,做过了一些实验,有兴趣的话可以去看一下:
http://topic.csdn.net/u/20080415/12/3f2b9589-e97c-4129-8941-011bd9203a98.html

收藏了,回家细看。
  • 打赏
  • 举报
回复
一个在原有空间上扩展
一个不停的创建
你说哪个快点呢?
  • 打赏
  • 举报
回复
在这个帖子 42 楼,做过了一些实验,有兴趣的话可以去看一下:

http://topic.csdn.net/u/20080415/12/3f2b9589-e97c-4129-8941-011bd9203a98.html
yzb123 2010-03-08
  • 打赏
  • 举报
回复
引用 2 楼 kaxionen 的回复:
同意楼上,当需要对字符串进行多次修改时,最好用StringBuffer

顶!
Amazer 2010-03-07
  • 打赏
  • 举报
回复
引用 11 楼 jll24 的回复:
首先String和StringBuffer在低层实现上都是字符数组,只不过String分配的是不大不小的一个数组,你+操作的时候他会根据你+的内容在分配一个正好能容纳的数组,这样你每+操作一次都要重新创建一个新的字符数组。而StringBuffer他初始化如果不指定的话他会分配一个128长度的字符数组(如果没记错是128),然后你每append的操作他都像已创建的数组添加内容,如果快要到128的时候,他会在原有长度上创建一个128*2长度的字符数组。说白了吧,就是用小箱子和大箱子装东西的区别,小箱子装东西你要更多的做把小箱子的东西倒出来找个合适的箱子然后把新加的东西放进去。

至于提到append比+更安全,能防止SQL注入攻击我真是不敢苟同,两个都是为了拼成一个字符串,在哪注入不是一样。

学习了
Amazer 2010-03-07
  • 打赏
  • 举报
回复
String新建了对象,StringBuffer可以修改
jll24 2010-03-07
  • 打赏
  • 举报
回复 1
首先String和StringBuffer在低层实现上都是字符数组,只不过String分配的是不大不小的一个数组,你+操作的时候他会根据你+的内容在分配一个正好能容纳的数组,这样你每+操作一次都要重新创建一个新的字符数组。而StringBuffer他初始化如果不指定的话他会分配一个128长度的字符数组(如果没记错是128),然后你每append的操作他都像已创建的数组添加内容,如果快要到128的时候,他会在原有长度上创建一个128*2长度的字符数组。说白了吧,就是用小箱子和大箱子装东西的区别,小箱子装东西你要更多的做把小箱子的东西倒出来找个合适的箱子然后把新加的东西放进去。

至于提到append比+更安全,能防止SQL注入攻击我真是不敢苟同,两个都是为了拼成一个字符串,在哪注入不是一样。
bolink5 2010-03-07
  • 打赏
  • 举报
回复 1
引用 8 楼 acerwang0423 的回复:
每次使用String的 "+",都是new了一个新的String 对象,
而StringBuffer 的append()方法,都是在原有的对象上进行的操作,
所以StringBuffer 比String 要高效

还有一点用appeand 比 + 更安全点。 防止SQL 注入。
cheung1987 2010-03-07
  • 打赏
  • 举报
回复
引用 8 楼 acerwang0423 的回复:
每次使用String的 "+",都是new了一个新的String 对象,
而StringBuffer 的append()方法,都是在原有的对象上进行的操作,
所以StringBuffer 比String 要高效


正解
acerwang0423 2010-03-06
  • 打赏
  • 举报
回复
每次使用String的 "+",都是new了一个新的String 对象,
而StringBuffer 的append()方法,都是在原有的对象上进行的操作,
所以StringBuffer 比String 要高效
Epiphone 2010-03-06
  • 打赏
  • 举报
回复
其实StringBuild的效率比StringBuffer还要好很多
StringBuffer是线程安全的,StringBuilder不是线程安全的
stu202060510 2010-03-06
  • 打赏
  • 举报
回复
String对象是不变的,如果用“+”对字符串进行修改,必然会导致String池中产生废弃的String对象。

StringBuffer和StringBuilder类型的对象能反复被修改,不会遗留废弃的Stirng对象

不考虑线程安全,StringBuffer和StringBuilder之间应优先选用StringBuilder,StringBuilder较StringBuffer运行的更快,应为StringBuffer是线程安全的
alex44667416 2010-03-06
  • 打赏
  • 举报
回复
三楼说得好!
应该加分!
huhk 2010-03-06
  • 打赏
  • 举报
回复
没有重新分配内存,除非初始化的内存用完。
luffyke 2010-03-06
  • 打赏
  • 举报
回复
字符串连接操作中StringBuffer的效率要比String高:

  String str = new String("welcome to ");

  str += "here";

  的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后

  再将StringBuffer toSting();

  这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

  并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.

  这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
kaxionen 2010-03-06
  • 打赏
  • 举报
回复
同意楼上,当需要对字符串进行多次修改时,最好用StringBuffer
sotom 2010-03-06
  • 打赏
  • 举报
回复
StringBuffer是用数组实现的,每次+不new对象,String是final类。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧