string 和stringbuffer性能

colinTongzw 2008-11-25 10:09:34
网上关于此两者的讨论太多了,但今天看了O'Reilly的Better Faster Lighter Java时,有些别的看法,例如:
String middle = "very, ";

String prefix "This code is ";

String suffix = "ugly."

String result = "";

StringBuffer buffer = new StringBuffer( );



buffer.append(prefix);

for (int i= 0; i<5; i++) {

buffer.append(middle);

}

buffer.append(suffix);

result = buffer.toString( );


or this one:

String result = "This code is ";



for (int i= 0; i<5; i++) {

result = result + "much, ";

}

result = result + "simpler, and neater.";


O'Reilly对此的看法是他并不觉得使用第一种编码会比第二种,实际上,以前旧版本的jvm是不会对string的拼接操作进行优化的,使得每次在进行拼接string时会再生成一个新的对象,因此,当循环数非常大时,例如10000个,你可以在内存中看到10000多个对象(没有回收的前提下),因此对于上千个并发来说,这个是相当恐怖的,但现在的JVM已经相当优化了,它会对string进行解释,因此,他认为上面两种在大批次循环是没有什么区别的,到最后,你同样要maintain a bigger blob of uglier code until the end of time,其实,如果在JVM有进行优化的前提下,第二种是在牺牲了一小部分性能的前提下达到了维护的方便性的,和代码的可读性的,因此个人也同意O'Reilly的看法,呵呵,欢迎大家继续讨论.
...全文
246 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
bijanen19861113 2011-08-15
  • 打赏
  • 举报
回复
弱弱的路过..
hoslay 2008-11-26
  • 打赏
  • 举报
回复
执行期应该没什么问题因为优化时候会优化成StringBuffer
bigbro001 2008-11-26
  • 打赏
  • 举报
回复
记号
colinTongzw 2008-11-26
  • 打赏
  • 举报
回复
从1.5以后,jvm的确做了大量的优化,但最优的还是要自己控制,比如kbyst说的:只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。 sb.insert(sb.length(), x) 中,如果有指定初始化长度,你会发现,整个的效率会提高至少10%,同理vector等也是一样
kbyst 2008-11-26
  • 打赏
  • 举报
回复
以上出自jdk1.5
kbyst 2008-11-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yujiaao 的回复:]
想问一下StringBuffer和StringBuilder有啥不同呢?
[/Quote]
一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。

例如,如果 z 引用一个当前内容为 "start" 的字符串的生成器对象,则该方法调用 z.append("le") 将使字符串生成器包含 "startle",而 z.insert(4, "le") 将更改字符串生成器,使之包含 "starlet"。

通常,如果 sb 引用 StringBuilder 的实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。

将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer
berlou 2008-11-26
  • 打赏
  • 举报
回复
最低的是不是String.concat()?
changxianguu 2008-11-26
  • 打赏
  • 举报
回复
学习了
CTea321 2008-11-26
  • 打赏
  • 举报
回复
学习了
我还以为stringbufer已经很高了呢,还有更高的
yyx14725 2008-11-26
  • 打赏
  • 举报
回复
现在java语言的发展就是为了提高速率和增强动态性
所以才有了StringBuilder的诞生
ouyangxiaokang6 2008-11-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yujiaao 的回复:]
想问一下StringBuffer和StringBuilder有啥不同呢?
[/Quote]
1,StringBuilder效率比前者高
2,StringBuilder是jdk 5.0后才有的。
ouyangxiaokang6 2008-11-26
  • 打赏
  • 举报
回复
StringBuilder最高
StringBuffer次之
String再次之
shenjie1989 2008-11-25
  • 打赏
  • 举报
回复
楼主很用功啊,向楼主学习了
colinTongzw 2008-11-25
  • 打赏
  • 举报
回复
不过大部分时间,stringbuffer效率是比string高的,不过,本文其实只是想讨论一个取舍的问题,因为采用stringbuffer,进行大批次append时,代码可读性比较差,不像"+"那么直接
colinTongzw 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yzsunlight 的回复:]
String 和 StringBuffer的区别
String 在每次 进行字符串想加的时候都会在 内存的堆里去创建一个对象 同时 还会在String pool池里去创建一个对象
而StringBuffer 则不同,他是在原有的对象的基础上进行修改
则StringBuffer的性能肯定是高于String
[/Quote]
实际上,"StringBuffer的性能肯定是高于String"我并同意这样,因为你没有考虑到运行期和编译期,运行期是不可预料的,而编译期是可预料的,你可以写代码测试一下,可以发现"+"的效率比stringbuffer高很多
colinTongzw 2008-11-25
  • 打赏
  • 举报
回复
如果你显示地调用String.intern(),实际上在对String进行操作时,是不会进行new的操作的
wtmiao000 2008-11-25
  • 打赏
  • 举报
回复
我是从5.0才开始真正了解java 的一般用字符串拼接,直接就用java.lang.StringBuilder。还没考需过这方面的问题。只是知道它的效率能快些。不过LZ说String已经优化了,那么就应该效率差不多了吧
colinTongzw 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yzsunlight 的回复:]
String 和 StringBuffer的区别
String 在每次 进行字符串想加的时候都会在 内存的堆里去创建一个对象 同时 还会在String pool池里去创建一个对象
而StringBuffer 则不同,他是在原有的对象的基础上进行修改
则StringBuffer的性能肯定是高于String
[/Quote]
实际上,并不一定,优化的JVM会维护一个内部的滞留字符串对象的列表(唯一字符串的池)来避免在堆内存中产生重复的String对象。当JVM从class文件里加载字符串字面量并执行的时候,它会先检查一下当前的字符串是否已经存在于滞留字符串列表,如果已经存在,那就不会再创建一个新的String对象而是将引用指向已经存在的String对象,JVM会在内部为字符串字面量作这种检查,但并不会为通过new关键字创建的String对象作这种检
colinTongzw 2008-11-25
  • 打赏
  • 举报
回复
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快
yzsunlight 2008-11-25
  • 打赏
  • 举报
回复
String 和 StringBuffer的区别
String 在每次 进行字符串想加的时候都会在 内存的堆里去创建一个对象 同时 还会在String pool池里去创建一个对象
而StringBuffer 则不同,他是在原有的对象的基础上进行修改
则StringBuffer的性能肯定是高于String
加载更多回复(3)

62,610

社区成员

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

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