氟塑料離心泵www.buybeng.com

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

          在java中,字符串的加法是如何實(shí)現(xiàn)的?

          當(dāng)我查看String類的concat函數(shù)的源碼時(shí),發(fā)現(xiàn)字符串連接是這么實(shí)現(xiàn)的:
          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. }  

          那么,字符串的連接符(+)的實(shí)現(xiàn)和這個(gè)有什么區(qū)別呢?如果有區(qū)別的話,那它是如何實(shí)現(xiàn)的呢?

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

           

          為了回答這個(gè)問題,我們可以做一個(gè)測(cè)試。

           

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

           

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

          所以,+ 和 concat 肯定是有區(qū)別的。

          在性能上,從 concat() 源碼可以看出,StringBuilder創(chuàng)建了更多的對(duì)象,而concat卻沒有,它使用的String類的內(nèi)部實(shí)現(xiàn)。

          綜上,當(dāng)我們需要連接兩個(gè)字符串的時(shí)候,我們應(yīng)當(dāng)優(yōu)先考慮使用 concat() 函數(shù),當(dāng)我們需要連接字符串和其它類型的變量時(shí),再考慮使用+運(yùn)算符

          譯者注:用 javap -c 查看java生成的字節(jié)碼:
          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 其實(shí)等價(jià)于
          原文來自站長(zhǎng)網(wǎng)www.software8.co/
          Java代碼:
          1. a = new StringBuilder()  
          2.     .append(a)  
          3.     .append(b)  
          4.     .toString();  

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


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2012年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          技術(shù)網(wǎng)站

          行業(yè)網(wǎng)站

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          站長(zhǎng)網(wǎng) 氟塑料離心泵 注塑機(jī) 液晶廣告機(jī)
          主站蜘蛛池模板: 义乌市| 昆明市| 邵阳县| 板桥市| 苏尼特左旗| 正蓝旗| 三门县| 汉川市| 台湾省| 永吉县| 姚安县| 龙泉市| 南靖县| 文登市| 平度市| 武陟县| 荆州市| 漳浦县| 绥芬河市| 武汉市| 通城县| 苍梧县| 东方市| 池州市| 宝清县| 台东县| 武陟县| 丰宁| 漳浦县| 吴堡县| 甘南县| 石阡县| 天镇县| 蒙山县| 石河子市| 常山县| 莆田市| 花垣县| 和静县| 屏东县| 航空|