分享

String

 书屋随身带 2014-06-15
浅谈String 字符串累加
Code:
  1. package francis;  
  2. public class TestString {  
  3.     public static void main(String[]args) {  
  4.         String s = "";  
  5.         for(int i = 0; i < 1000; i++) {  
  6.             s += i;  
  7.         }  
  8.         System.out.println(s);  
  9.     }  
  10. }  
  11. 上段代码的编译可以用jclasslib检测。
  12. 检测结果
  13. 上面的程序被编译成了22行的代码,我们注意看一下第6行到第18行,这是整个for循环所执行的代码,我们会很明显的看到,每次循环都会执行第6行的代码,也就是每次都会新建了一个StringBuilder对象,这多么浪费性能啊。

    这就很明显了,每一次字符串的拼接,编译器都是通过新建StringBuilder对象来完成的。

    哎,如果编译器足够智能,将新建StringBuilder对象放到循环之外,就不用我们去操心性能问题,但是,貌似目前编译器还办不到。所以我们手动的新建StringBuilder是比较好的方案:

    Code:
    1. package francis;  
    2. public class TestString {  
    3.     public static void main(String[]args) {  
    4.         String s = "";  
    5.         StringBuilder sb = new StringBuilder(s);  
    6.         for(int i = 0; i < 1000; i++) {  
    7.             sb.append(i);  
    8.         }  
    9.         s = sb.toString();  
    10.         System.out.println(s);  
    11.     }  
    12. }  

    为了确定是否真的达到效果,我们来看一下这次编译后的代码:

  14. 这次循环的代码是在11~18行,而创建StringBuilder对象是在第三步执行。这样就避免了编译器会每个循环都新建一个StringBuilder对象了。比较好的习惯就是当连接字符串操作比较多的时候直接手动新建StringBuilder对象.

    那有人可能会问了,String的每次拼接都是利用创建StringBilder对象来处理么? 实践乃检验真理的唯一方法:

    先写代码:

    Code:
    1. package francis;  
    2. public class TestString {  
    3.     public static void main(String[]args) {  
    4.         String a = "a" + "b" + "c";  
    5.         String b = a + "b";  
    6.         String c = a + b;  
    7.         System.out.println(a + b + c);  
    8.     }  
    9. }  

    然后再看一下编译后的结果,由于比较长,我分成两张图片:

  15. 很显然,有四个new StringBuilder操作。基本可以得出结论:需要字符串连接的时候,如果没有可用的对应的StringBuilder就会去新建。因此字符串操作还是推荐自己手动去new StringBuilder,不能依赖编译器的优化。

    当然会有很多其它情况,比如我在第三行代码后面加一个c+=a;a+=b;会产生什么样的情况呢?实践乃检验真理的唯一方法

http://blog.csdn.net/xjlnjut730/article/details/6512230

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多