氟塑料離心泵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 你爸是李剛 閱讀(1514) 評論(0)  編輯  收藏


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


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

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          技術網站

          行業網站

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          站長網 氟塑料離心泵 注塑機 液晶廣告機
          主站蜘蛛池模板: 巴青县| 易门县| 铜陵市| 金沙县| 文昌市| 扎兰屯市| 金堂县| 徐水县| 商河县| 台南市| 霸州市| 册亨县| 内江市| 拜城县| 霍城县| 高邮市| 海城市| 宝清县| 浦江县| 孙吴县| 宣化县| 康定县| 无为县| 灌南县| 新和县| 台山市| 丹东市| 施秉县| 崇礼县| 万州区| 邵武市| 贡觉县| 巴里| 沐川县| 吉林市| 张家界市| 页游| 连云港市| 镇雄县| 纳雍县| 平南县|