整体内容介绍
本文分为几个部分:
* String、StringBuffer、StringBuilder的对比
* 字符串拼接方式的对比
使用到的内容:
* Junit4单元测试
* slf4j的日志框架
String、StringBuffer、StringBuilder的对比
对于这三者使用的场景做如下概括(参考:《编写搞质量代码:改善java程序的151个建议》):
- String:在字符串不经常变化的场景中可以使用String类,如:常量的声明、少量的变量运算等。
- StringBuffer:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装等。
- StringBuilder:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用StringBuffer,如SQL语句的拼装、JSON封装等(貌似这两个我也是使用|StringBuffer)。
字符串拼接方式对比
package com.zy.util;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestString {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
public void testPlus() {
String s = "";
long ts = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
s = s + String.valueOf(i);
}
long te = System.currentTimeMillis();
//System.out.println("+ cost {} ms:"+(te-ts));
logger.info("+ cost {} ms", te - ts);
}
@Test
public void testConcat() {
String s = "";
long ts = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
s = s.concat(String.valueOf(i));
}
long te = System.currentTimeMillis();
//System.out.println("concat cost {} ms:"+(te-ts));
logger.info("concat cost {} ms", te - ts);
}
@Test
public void testStringBuffer() {
StringBuffer sb = new StringBuffer();
long ts = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
sb.append(String.valueOf(i));
}
sb.toString();
long te = System.currentTimeMillis();
//System.out.println("StringBuffer cost {} ms:"+(te-ts));
logger.info("StringBuffer cost {} ms", te - ts);
}
@Test
public void testStringBuilder() {
StringBuilder sb = new StringBuilder();
long ts = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
sb.append(String.valueOf(i));
}
sb.toString();
long te = System.currentTimeMillis();
//System.out.println("StringBuilder cost {} ms:"+(te-ts));
logger.info("StringBuilder cost {} ms", te - ts);
}
}
上述程序结果如下:
2015-6-9 16:01:58 com.zy.util.TestString testPlus
信息: + cost 504 ms
2015-6-9 16:01:58 com.zy.util.TestString testConcat
信息: concat cost 196 ms
2015-6-9 16:01:58 com.zy.util.TestString testStringBuffer
信息: StringBuffer cost 2 ms
2015-6-9 16:01:58 com.zy.util.TestString testStringBuilder
信息: StringBuilder cost 2 ms
可以看出,+和concat的方式速度较慢,需要创建新串。
而StringBuffer和StringBuilder较快。
参考资源
不足地方
- 使用javap进行反编译,具体再做分析
时间: 2024-11-29 11:29:09