氟塑料離心泵www.buybeng.com

          jquery教程http://www.software8.co/wzjs/jquery/

          在java中,字符串的加法是如何實現的?

          當我查看String類的concat函數的源碼時,發現字符串連接是這么實現的:
          Java代碼:
          1. public String concat(String str) {  
          2.     int otherLen = str.length();  
          3.     if (otherLen == 0) {  
          4.         return this;  
          5.     }  
          6.     int len = value.length;  
          7.     char buf[] = Arrays.copyOf(value, len + otherLen);  
          8.     str.getChars(buf, len);  
          9.     return new String(buf, true);  
          10. }  

          那么,字符串的連接符(+)的實現和這個有什么區別呢?如果有區別的話,那它是如何實現的呢?

          此外,這兩者分別在什么場合使用,有沒有性能上的差異。

           

          為了回答這個問題,我們可以做一個測試。

           

          首先,我們連接兩個字符串
          Java代碼:
          1. String s1 = "foo";  
          2. String s2 = "bar";  
          3. String s3 = s1 + s2;  

           

          下面我們將這個代碼編譯成class文件,然后再反編譯(可以用JAD),我們得到反編譯后的代碼是:
          Java代碼:
          1. String s = "foo";  
          2. String s1 = "bar";  
          3. String s2 = (new StringBuilder()).append(s).append(s1).toString();  

          所以,+ 和 concat 肯定是有區別的。

          在性能上,從 concat() 源碼可以看出,StringBuilder創建了更多的對象,而concat卻沒有,它使用的String類的內部實現。

          綜上,當我們需要連接兩個字符串的時候,我們應當優先考慮使用 concat() 函數,當我們需要連接字符串和其它類型的變量時,再考慮使用+運算符

          譯者注:用 javap -c 查看java生成的字節碼:
          Java代碼:
          1. java.lang.String cat(java.lang.String, java.lang.String);  
          2.   Code:  
          3.    0:   new     #2//class java/lang/StringBuilder  
          4.    3:   dup  
          5.    4:   invokespecial   #3//Method java/lang/StringBuilder."<init>":()V  
          6.    7:   aload_1  
          7.    8:   invokevirtual   #4//Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;  
          8.    11:  aload_2  
          9.    12:  invokevirtual   #4//Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;  
          10.    15:  invokevirtual   #5//Method java/lang/StringBuilder.toString:()Ljava/lang/    String;  
          11.    18:  astore_1  
          12.    19:  aload_1  
          13.    20:  areturn  
          可以看出 a += b 其實等價于
          原文來自站長網www.software8.co/
          Java代碼:
          1. a = new StringBuilder()  
          2.     .append(a)  
          3.     .append(b)  
          4.     .toString();  

          posted on 2012-12-31 13:39 你爸是李剛 閱讀(1512) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2012年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          技術網站

          行業網站

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          站長網 氟塑料離心泵 注塑機 液晶廣告機
          主站蜘蛛池模板: 锦屏县| 孟连| 宁海县| 烟台市| 兴山县| 临漳县| 康定县| 石楼县| 贵州省| 邢台县| 津南区| 新民市| 诏安县| 岳西县| 赣榆县| 平武县| 彰化县| 霍城县| 尚义县| 聂荣县| 咸阳市| 蕲春县| 新蔡县| 调兵山市| 漳浦县| 澎湖县| 儋州市| 兴和县| 陇川县| 康保县| 禹州市| 镇宁| 高密市| 洛浦县| 芮城县| 汕尾市| 温宿县| 紫云| 宕昌县| 饶阳县| 汽车|