1. 先贴代码:
public class StringPerformanceTest {
public static void main(String[] args) {
int iterations = 100000;
long startTime = System.currentTimeMillis();
String str = "";
for (int i = 0; i < iterations; i++) {
str += "a";
}
long endTime = System.currentTimeMillis();
System.out.println("String执行时间: " + (endTime - startTime) + " ms");
startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < iterations; i++) {
sb.append("a");
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder执行时间: " + (endTime - startTime) + " ms");
startTime = System.currentTimeMillis();
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < iterations; i++) {
stringBuffer.append("a");
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer执行时间: " + (endTime - startTime) + " ms");
}
}
2. 运行结果:
请注意,执行时间将因计算机的性能而异,但在大多数情况下,StringBuilder和StringBuffer比简单的String拼接更快。
String执行时间: 7834 ms
StringBuilder执行时间: 1 ms
StringBuffer执行时间: 2 ms
3. 区别:
3.1 String 类
String类内部的实现也是一个字节数组,这个数组是final类型的,因此String是不可变的对象,每次在对String类进行改变的时候都会生成一个新的string对象,然后将指针指向新的string对象。
3.2 StringBuiler 类
和 String 类不同的是,StringBuilder 类的对象能够被多次的修改,并且不产生新的对象。这个特性的意义在于,如果我们进行大量的字符串操作,使用String类就会产生很大的性能消耗,而StringBuilder就可以避免这个问题。
3.3 StringBuffer 类
StringBuffer 和StringBuiler之间的最大不同在于 StringBuffer 的方法是线程安全的。因为StringBuffer的所有公开方法都是synchronized修饰的,而StringBuilder并没有synchronized修饰。
4. 总结:
- 如果不涉及字符串操作,那么String类是首选,
- 如果涉及的字符串操作没有线程安全问题,那么使用StringBuilder,
- 如果涉及的字符串操作存在线程安全问题,那么使用StringBuffer。