String 和 StringBuffer的效率问题

whyy0 2005-06-10 10:15:51
① String aa = "aa" + "bb" + "cc";
② StringBuffer aa = new StringBuffer("aa" + "bb" + "cc");
③ StringBuffer aa = new StringBuffer();
aa.append("aa");
aa.append("bb");
aa.append("cc");

以上3个方案哪个效率高??为什么??
...全文
1028 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyy7751 2005-06-16
  • 打赏
  • 举报
回复
数据量大时用StringBuffer,很快的
ChDw 2005-06-16
  • 打赏
  • 举报
回复
String a = "afdsafda";
String b = a + "fs";

这样的代码,编译器无法优化
但是这样可以:
final String a = "afdsafda";
final String b = a + "fs";
whyy0 2005-06-16
  • 打赏
  • 举报
回复
我知道了在 + 号上
whyy0 2005-06-16
  • 打赏
  • 举报
回复
ChDw(米)
看了你的讲解是明白了不少。
但是我还是不明白1和2比3多消耗的时间在那里呢??
Kala_Yang 2005-06-15
  • 打赏
  • 举报
回复
谢谢了,我也长进了不少,互相学习,互相鼓励了,顶!
rswhs 2005-06-15
  • 打赏
  • 举报
回复
up up up

有点收获
leihailin 2005-06-15
  • 打赏
  • 举报
回复
请问编译器怎么优化下面的代码
String a="afdsafda";
String a=a+"fs";

还有更有效率的方法做到这件事情么
leihailin 2005-06-15
  • 打赏
  • 举报
回复
请问 ChDw(米) 学了多长时间的JAVA了啊
没别的意思,只是感觉你分析的不错,我是新手,
ChDw 2005-06-15
  • 打赏
  • 举报
回复
String constA = "aaaaaaaaaaaaaaaaa";
String constB = "bbbbbbbbbbbbbbbbbbbbbb";
String constC = "ccccccccccccccccccccc";
long t1 = System.currentTimeMillis();
for (int i = 0; i < 500000; i++) {
1. //String aa = constA + constB + constC;

2. //StringBuffer aa = new StringBuffer(constA + constB + constC);

3. StringBuffer aa = new StringBuffer();
aa.append(constA);
aa.append(constB);
aa.append(constC);

4. StringBuffer aa = new StringBuffer(constA);
aa.append(constB);
aa.append(constC);

}
long t2 = System.currentTimeMillis();
System.out.println("(T2-T1):" + (t2 - t1));




在我的机器上面
1. 用时 700ms
2. 用时 1100ms
3. 用时 620ms
4. 用时 550ms
ChDw 2005-06-15
  • 打赏
  • 举报
回复
我为什么说你的不正确,这是因为
for (int i = 0; i < 500; i++) {
String aa = "aaaaaaaaaaaaaaaaa" + "bbbbbbbbbbbbbbbbbbbbbb" + "ccccccccccccccccccccc";
}
这样做法,首先编译器自动帮助你优化成
for (int i = 0; i < 500; i++) {
String aa = "aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccc";
}

所以在这个过程中,根本没有生成任何对象(那个是字符串常量,只会在类中存在一份,aa每次都指向这个常量罢了),所以没有任何拷贝动作


for (int i = 0; i < 500; i++) {
StringBuffer aa = new StringBuffer("aaaaaaaaaaaaaaaaa" + "bbbbbbbbbbbbbbbbbbbbbb" + "ccccccccccccccccccccc");

}

优化成:
for (int i = 0; i < 500; i++) {
StringBuffer aa = new StringBuffer("aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccc");
}
即,除了一个常量以外,还会在循环中生成一个StringBuffer对象,但是它是在构造函数中已经完成了,没有后续函数调用!



最后一种 :
for (int i = 0; i < 500; i++) {
StringBuffer aa = new StringBuffer();
aa.append("aaaaaaaaaaaaaaaaa");
aa.append("bbbbbbbbbbbbbbbbbbbbbb");
aa.append("ccccccccccccccccccccc");
}

编译器无法优化(它没有这么聪明),所以这种方法会有三个字符串常量,并每次循环有构造函数外还额外调用多三次方法

从上述可以看到,这个根本是因为编译器的优化造成的
如果你将程序改成
String constA = "aaaaaaaaaaaaaaaaa";
String constB = "bbbbbbbbbbbbbbbbbbbbbb";
String constC = "ccccccccccccccccccccc";


再将后面相应的换成上面的constA, constB, constC,

你就会发现这三者的速度是相当的
supernovaex 2005-06-15
  • 打赏
  • 举报
回复
Mark
airhand 2005-06-15
  • 打赏
  • 举报
回复
3最好,使用的空间最少,前两种要浪费很多空间,虽然不用你回收,但也是不经济的。
whyy0 2005-06-15
  • 打赏
  • 举报
回复
ChDw(米) 首先感谢你的回答

我当然知道什么样的情况下有巨大差异,我就使要问这样的特殊情况,只是想给大家提个醒,不要只记结果,不分析什么情况。

你可以自己看看我的问题,再看看我的测试程序,你怎么可以说我写的不对呢??
比特灵 2005-06-14
  • 打赏
  • 举报
回复
Mark Mark
HStone 2005-06-14
  • 打赏
  • 举报
回复
顶一下 ChDw(米)

把变量定义放在循环体外是个很基础的优化常识喔!
mbh0210 2005-06-14
  • 打赏
  • 举报
回复
写程序也有几个月了,还没有仔细的研究过这些东西啊,惭愧,学习中.....
microunit 2005-06-14
  • 打赏
  • 举报
回复
学习
ChDw 2005-06-14
  • 打赏
  • 举报
回复
那是因为你的测试程序写得不正确造成的,
StringBuffer sb = new StringBuffer();
for(int i = 0; i < 10000; i++)
sb.append("FFFFF");




String a = "";
for(int i = 0; i < 10000; i++)
a += "FFFFF";


你这样就可以发现其中的巨大差异
sublive 2005-06-13
  • 打赏
  • 举报
回复
1楼的已经说的很清楚了。
大家都知道StringBuffer在连接字符方面效率高,但还要看是什么情况下用。
yonghar 2005-06-13
  • 打赏
  • 举报
回复
一个血的教训:
曾经用sax解析一份大的xml文件的时候,把值放在String,用+连接。
运行一段时间,程序总会等待好几分钟来回收垃圾,而且这个时候什么事情都干不了的。
等待几分钟意味着时间是正常的100倍量级,甚至千倍。
加载更多回复(20)

62,614

社区成员

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

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