都说在大量字符串拼接时尽量使用StringBuilder.append()来代替String += 来提高效率,但是出于好奇想看一下究竟效率差多少。写个程序测试一下:
public class Test {
private static final Logger logger = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
Integer num = 100;
String s = "hdfs://ns11/";
long b1 = System.currentTimeMillis();
for (int i = 0; i < num; i++) {
s += i;
}
long e1 = System.currentTimeMillis();
System.out.println("+= : " + (e1-b1));
StringBuilder sb = new StringBuilder("hdfs://ns11/");
for (int i = 0; i < num; i++) {
sb.append(i);
}
sb.toString();
long e2 = System.currentTimeMillis();
System.out.println(".append :" + (e2-e1) );
}
}
结果展示
1.当循环次数num=100时;
+= : 0
.append :0
表示在循环100次时没有看出来差别
2.当循环次数num=1000时;
+= : 6
.append :0
表示在循环1000次时差别是6毫秒
3.当循环次数num=10000时;
+= : 319
.append :1
表示在循环10000次时差别是318毫秒
4.当循环次数num=100000时;
+= : 16549
.append :3
表示在循环100000次时差别是16546毫秒也就是16秒半的差别。
分析原因
1.首先String
我们知道在java中字符串是定长的,所以每次+=都是重新创建String对象,所以每次+=都是一个内存开辟
2.StringBuilder分析
1.StringBuilder
初始化StringBuilder是创建一个容量为16的char数组
2.扩容系数: value.length * 2 + 2,
而且只有当append是数据长度+value.count > value.length时才会扩容一次,不会每次都扩容去调用Arrays.copyof()
复制数组,并扩容数组