Java字符串拼接方式有如下几种
+号拼接
concat拼接耗时
join拼接
StringBuilder拼接
StringBuffer拼接
那哪种拼接效率高呢?该篇便准备用代码测试一下。
测试代码如下:
public class TestEfficiency {
public static void main(String[] args) {
String add = add();
String concat = concat();
String join = join();
String builder = builder();
String buffer = buffer();
}
// +号拼接
public static String add() {
String string = "";
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
string += "a";
}
long endTime = System.currentTimeMillis();
System.out.println("+号拼接耗时:" + (endTime - startTime));
return string;
}
// concat拼接
public static String concat() {
String string = "";
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
string = string.concat("a");
}
long endTime = System.currentTimeMillis();
System.out.println("concat拼接耗时:" + (endTime - startTime));
return string;
}
// join拼接
public static String join() {
String string = "";
long startTime = System.currentTimeMillis();
List list = new ArrayList();
for (int i = 0; i < 100000; i++) {
list.add("a");
}
string = String.join(string, list);
long endTime = System.currentTimeMillis();
System.out.println("join拼接耗时:" + (endTime - startTime));
return string;
}
// StringBuilder拼接
public static String builder() {
StringBuilder sb = new StringBuilder();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
sb.append("a");
}
long endTime = System.currentTimeMillis();
System.out.println("StringBuilder拼接耗时:" + (endTime - startTime));
return sb.toString();
}
// StringBuffer拼接
public static String buffer() {
StringBuffer sb = new StringBuffer();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
sb.append("a");
}
long endTime = System.currentTimeMillis();
System.out.println("StringBuffer拼接耗时:" + (endTime - startTime));
return sb.toString();
}
}
测试结果:
+号拼接耗时:2821
concat拼接耗时:689
join拼接耗时:20
StringBuilder拼接耗时:3
StringBuffer拼接耗时:5
在java中String是不可变长的,一旦初始化就不能修改长度,简单的字符串拼接其实是创建新的String对象,再把拼接后的内容赋值给新的对象,在频繁修改的情况下会频繁创建对象。
而StringBuffer和StringBuilder则是将String转换成char数组,数组是可以扩容的,这样就不需要不停创建对象了。
另外,由于StringBuffer在拼接过程中加了锁以保证线程安全,所以效率会比StringBuilder低一些。