首页 > 代码库 > 字符串连接操作下的String和StringBuilder(一)

字符串连接操作下的String和StringBuilder(一)

看第一种情形:用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效率更高的原因。