字符串处理

princy | October 20th, 2011 - 12:25:41

单纯的字符串连接速度比较

  • String  27183微秒

String testString = new String();
for (int i = 0; i < 100000; i++) {
testString += “test”;
}

  • StringBuffer  10微秒

StringBuffer testStringBuffer = new StringBuffer();
for (int i = 0; i < 100000; i++) {
testStringBuffer.append(“test”);
}
testStringBuffer.toString();

  • StringBuilder  6微秒

StringBuilder testStringBuilder = new StringBuilder();
for (int i = 0; i < 100000; i++) {
testStringBuilder.append(“test”);
}
testStringBuilder.toString();

结论: String>StringBuffer>StringBuilder. 其中String甩开StringBuffer和StringBuilder好几条街

原因: String每次链接的时候需要重新分配新空间,连接字符串,然后指向新链接的字符串.而StringBuffer和StringBuilder不需要重新实例化字符串,只需要在后面追加就可以了.如此以来,String连接时候步骤增加不少,并且内存占用会更大一些.

其余补充:

1.  为了获得更好的性能,在构造 StirngBuffer 或 StirngBuilder 时应尽可能指定它的容量。当然,如果你操作的字符串长度不超过 16 个字符就不用了。

2.  相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非你能确定你的系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,否则还是用StringBuffer 吧 J

3.  用好现有的类比引入新的类更重要。很多程序员在使用 StringBuffer 时是不指定其容量的(至少我见到的情况是这样),如果这样的习惯带入 StringBuilder 的使用中,你将只能获得 10 %左右的性能提升(不要忘了,你可要冒多线程的风险噢);但如果你使用指定容量的 StringBuffer ,你将马上获得 45% 左右的性能提升,甚至比不使用指定容量的StirngBuilder 都快 30% 左右。

 

You can leave a response, or trackback from your own site.

Leave a Reply