看第一种情形:用String做字符串连接操作 连接一万次
public class Demo_01 { public static void main(String[] args) { String str = "123"; String[] temp = new String[10000]; for (int i = 0; i < temp.length; i++) { temp[i] = "456"; } long begin = System.nanoTime()/1000000L; System.out.println(begin); for (int i = 0; i < temp.length; i++) { str += temp[i]; } long end = System.nanoTime()/1000000L; System.out.println(end); System.out.println("连接操作消耗的时间:"+(end-begin)+"毫秒"); } }
编译 执行
做同样的字符串连接 也是连接一万次 这次使用StringBuilder
public class Demo { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); sb.append("123"); String[] temp = new String[10000]; for (int i = 0; i < temp.length; i++) { temp[i] = "456"; } long begin = System.nanoTime()/1000000L; System.out.println(begin); for (int i = 0; i < temp.length; i++) { sb.append(temp[i]); } long end = System.nanoTime()/1000000L; System.out.println(end); System.out.println("连接操作消耗的时间:"+(end-begin)+"毫秒"); } }
编译 执行
对比执行消耗的时间,String是479毫秒 StringBuilder是2毫秒 。(毫秒数仅作参考,不同Pc配置和OS环境因素下可能不同)
做同样的字符串连接操作 使用StringBuilder用时仅需使用String的1/240左右。
可见做大量字符串连接时用StringBuilder效率更高。
这学过Java的都知道啊,用你说。
可是为什么做大量字符串连接时 StringBuilder效率更高呢?
这是一个值得思考的问题。
嗯,我们先从编译器给我们反馈的信息看看。
对于用String进行连接,使用反汇编命令
得到如下信息
可以看到79 行 goto语句指向47行 这之间是循环体。
嗯?我明明是用的String啊,但是事实上是编译器擅作主张用了StringBuilder做连接操作。(StringBuilder效率高)
注意到54行 每次循环都会创建新的StringBuilder对象。
再看使用StringBuilder进行操作的情况:
反馈的信息
注意看78行的goto语句 指向59行 这之间也是循环体。
但是这次循环体中只有一个StringBuilder对象。编译器不会每次循环都创建新的StringBuilder对象。
所以相比使用String,在进行大量字符串连接时,StringBuilder效率更高。
下一节将从源码的角度出发,探讨StringBuilder效率更高的原因。
字符串连接操作下的String和StringBuilder(一)
时间: 2024-10-06 23:20:36