字符串拼接的几种方式
- String直接拼接
- StringBuffer
- StringBuilder
- StringJoiner(从jdk8开始支持,其拼接思想与方式四类似)
上述几个方式中,String直接拼接的方式无疑是最慢的。因为每次拼接都要开辟新的空间,只要简单测试,拼接百次,就会出现很大的差别,本文不予关注。
StringBuffer和StringBuilder
两个类的api接口基本一致,区别在于StringBuffer是线程安全的,对所有的操作方法都使用了synchronized关键字;StringBuilder是非线程安全的。在单线程的场景下,推荐使用StringBuilder,多线程场景下,需使用StringBuffer。由于StringBuffer的多线程安全性,使它的效率相对来说会差一些(达到一定的拼接次数才会显示差异)。
本文主要关注的场景为按照一定格式拼接字符串,最终格式如:a,b,c
实现方式
- 拼接方式1 判断是否为最后一个拼接项,如果是,则不拼接分隔符
- 拼接方式2 拼接完成后,对结果进行截取(先拼接内容,再拼接分隔符)
- 拼接方式3 拼接完成后,对结果进行截取(先拼接分隔符,再拼接分隔符)
- 拼接方式4 第一个拼接项不再循环内进行,拼接完成后,直接为需要的结果
public class TestString {
public static void main(String[] args) {
int times = 100000;
// 拼接方式1 判断是否为最后一个拼接项,如果是,则不拼接分隔符
long startTime = System.currentTimeMillis();
StringBuffer sb1 = new StringBuffer();
for (int i = 0; i <= times; i++) {
if(i == times){
sb1.append("abc");
}else{
sb1.append("abc").append(",");
}
}
String s = sb1.toString();
System.out.println(String.valueOf(System.currentTimeMillis() - startTime));
// 拼接方式2 拼接完成后,对结果进行截取(先拼接内容,再拼接分隔符)
startTime = System.currentTimeMillis();
StringBuffer sb2 = new StringBuffer();
for (int i = 0; i <= times; i++) {
sb2.append("abc").append(",");
}
String substring = sb2.substring(0, sb2.length() - 1);
System.out.println(String.valueOf(System.currentTimeMillis() - startTime));
// 拼接方式3 拼接完成后,对结果进行截取(先拼接分隔符,再拼接分隔符)
startTime = System.currentTimeMillis();
StringBuffer sb3 = new StringBuffer();
for (int i = 0; i <= times; i++) {
sb3.append(",").append("abc");
}
String substring2 = sb2.substring(1);
System.out.println(String.valueOf(System.currentTimeMillis() - startTime));
// 拼接方式4 第一个拼接项不再循环内进行,拼接完成后,直接为需要的结果
startTime = System.currentTimeMillis();
StringBuffer sb4 = new StringBuffer();
sb4.append("abc");
for (int i = 1; i <= times; i++) {
sb4.append(",").append("abc");
}
String s1 = sb4.toString();
System.out.println(String.valueOf(System.currentTimeMillis() - startTime));
}
}
测试结果
测试耗时单位为ms
拼接次数 | 方式一 | 方式二 | 方式三 | 方式四 |
---|---|---|---|---|
4K | 1 | 1 | 1 | 1 |
5K | 2 | 1 | 1 | 1 |
1W | 3 | 3 | 2 | 1 |
5W | 6 | 3 | 4 | 3 |
10W | 10 | 8 | 6 | 6 |
20W | 22 | 16 | 14 | 13 |
结果分析
基于上述测试结果,拼接次数在4000次及一下,四种拼接方式耗时无明显差异;
从5000次开始,方式一的耗时开始比其他方式增多;
从1W次开始,方式二的耗时开始多于方式三、四;
方式三和四在多次测试中,总体耗时相差不多,从20W次开始,方式四为最优选择;
总结
在多数应用场景中,并不需要特别大量的字符串拼接,可按照实际应用场景选择自己需要的,喜欢的方式即可。