首页 > 代码库 > 字符串连接操作下的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效率更高的原因。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。