三者使用建议: 少量字符(拼接次数少,且字符串总长度短)串拼接String更快一点,拼接的数据量稍大点(拼接字次数十次左右,总长度大概1000个英文字符),StringBuilder和StringBuffer有差距但不是很大,建议采用StringBuffer,安全且效率不会太低。
一、三者区别
String:
String字符串内容定义后是不可变的,拼接字符串会开辟新的内存空间,造成资源浪费。
String str = "我是"; // ①"我是"会开辟一个内存空间
str+="程序员"; // ②"程序员"会开辟一个内存空间,③同时新的str"我是程序员"也会生成一个内存空间
StringBuffer:
继承自AbstractStringBuilder类,append方法拼接字符串,线程安全,但执行效率低。
StringBuilder:
同上,继承自AbstractStringBuilder类,append方法拼接字符串,由于没有对方法加锁同步,造成了线程不安全,但是执行效率高。
二、 执行效率
1.执行效率:
StringBuilder > StringBuffer > String
2.实验数据:
1.英文SQL拼接耗时(拼接字符总长度3945,拼接次数49,共执行10000次)
StringBuffer > StringBuilder > String
StringBuffer
(149+141+138+135+144) / 5 ≈ 141.4 ms
StringBuilder
(139+155+150+162+155) / 5 ≈ 152.2 ms
String(由于执行10000次进程卡死,以下实验数据为2500次,但此时耗时已明显比前两者多了)
(195+183+196+186+217) / 5 ≈ 195.4 ms
2.中英及特殊字符拼接耗时(拼接字符总长度756,拼接次数28,共执行10000次)
StringBuffer > StringBuilder > String
StringBuffer
(50+59+58+47+49) / 5 ≈ 52.6 ms
StringBuilder
(51+56+53+60+50) / 5 ≈ 54 ms
String
(157+151+136+156+136) / 5 ≈ 147.2 ms
4.测试代码(建议三者单独写main方法测试,减少不可控因素影响):
public class HelloWorld {
public static void main(String[] args) {
long start1 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
StringBuilder sql = new StringBuilder();
sql.append("");
sql.append("");
sql.append("");
sql.append("");
}
System.out.println("StringBuilder cost time:" + (System.currentTimeMillis() - start1) + "ms");
long start2 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
StringBuffer sql = new StringBuffer();
sql.append("");
sql.append("");
sql.append("");
sql.append("");
}
System.out.println("StringBuffer cost time:" + (System.currentTimeMillis() - start2) + "ms");
long start3 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
String sql = "";
sql+="";
sql+="";
sql+="";
}
System.out.println("string+ cost time:" + (System.currentTimeMillis() - start3) + "ms");
}
}
5.总结:
实验数据只能仅供参考了(笑哭)