成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

“+=”和append的區(qū)別

ztyzz / 1637人閱讀

摘要:和的區(qū)別是面試中出現(xiàn)頻率較高的一個題目了,下面我們就來分析一下這兩者的區(qū)別吧。所以我們在平時寫代碼的時候一定注意,不要再循環(huán)中使用操作,效率很低的。

“+=”和append的區(qū)別是面試中出現(xiàn)頻率較高的一個題目了,下面我們就來分析一下這兩者的區(qū)別吧。
首先看一下這段代碼的結(jié)果:

String s1 = "a";
String s2 = s1 + "b";
System.out.println(s2 == "ab"); // false

輸出結(jié)果是false;

javap將其反編譯之后的結(jié)果如下:

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String a
       2: astore_1
       3: new           #3                  // class java/lang/StringBuilder
       6: dup
       7: invokespecial #4                  // Method java/lang/StringBuilder."":()V
      10: aload_1
      11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      14: ldc           #6                  // String b
      16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      22: astore_2
      23: getstatic     #8                  // Field java/lang/System.out:Ljava/io/PrintStream;
      26: aload_2
      27: ldc           #9                  // String ab
      29: if_acmpne     36
      32: iconst_1
      33: goto          37
      36: iconst_0
      37: invokevirtual #10                 // Method java/io/PrintStream.println:(Z)V
      40: return

根據(jù)結(jié)果我們可以看到:

虛擬機開始是定義了一個字符串”a“將其入棧;

然后new了一個StringBuilder對象,將”a“封裝到Sb對象中;

之后用StringBuilder的append()方法來完成"a"和"b"的拼接;

所以這里的"ab"字符串本質(zhì)上是一個StringBuilder對象,所以再去跟常量"ab"去比較的話會是false;
這樣看來用"+"和append效率似乎是一樣的,并沒有像網(wǎng)上說的那樣”+“操作比append()更消耗性能。

那下面我們來看一下這兩者在循環(huán)中是什么結(jié)果:
首先是”+=“操作:

public static void main(String[] args) {
    String[] arr = new String[]{"a","b","c"};
    String result = "";
    for (int i = 0 ; i < arr.length; i ++) {
        result += arr[i];
    }
    System.out.println(result);
}

反編譯結(jié)果如下:

  public static void main(java.lang.String[]);
    Code:
       0: iconst_3
       1: anewarray     #2                  // class java/lang/String
       4: dup
       5: iconst_0
       6: ldc           #3                  // String a
       8: aastore
       9: dup
      10: iconst_1
      11: ldc           #4                  // String b
      13: aastore
      14: dup
      15: iconst_2
      16: ldc           #5                  // String c
      18: aastore
      19: astore_1
      20: ldc           #6                  // String
      22: astore_2
      23: iconst_0
      24: istore_3
      25: iload_3
      26: aload_1
      27: arraylength
      28: if_icmpge     58
                                                                                                                                                                            43,1          34%
      31: new           #7                  // class java/lang/StringBuilder
      34: dup
      35: invokespecial #8                  // Method java/lang/StringBuilder."":()V
      38: aload_2
      39: invokevirtual #9                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      42: aload_1
      43: iload_3
      44: aaload
      45: invokevirtual #9                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      48: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      51: astore_2
      52: iinc          3, 1
      55: goto          25
      58: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
      61: aload_2
      62: invokevirtual #12                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      65: return

可以看到從25: iload_355: goto 25兩句構(gòu)成了一個循環(huán),而31: new #7 // class java/lang/StringBuilder創(chuàng)建StringBuilder對象語句在循環(huán)內(nèi),所以會創(chuàng)建多個
SB對象;

下面我們把代碼改為append()實現(xiàn):

    public static void main(String[] args) {
        String[] arr = new String[]{"a","b","c"};
        StringBuilder result = new StringBuilder();
        for (int i = 0 ; i < arr.length; i ++) {
            result.append(arr[i]);
        }
        System.out.println(result);
    }

反編譯后:

  public static void main(java.lang.String[]);
    Code:
       0: iconst_3
       1: anewarray     #2                  // class java/lang/String
       4: dup
       5: iconst_0
                                                                                                                                                                            85,7          68%
       6: ldc           #3                  // String a
       8: aastore
       9: dup
      10: iconst_1
      11: ldc           #4                  // String b
      13: aastore
      14: dup
      15: iconst_2
      16: ldc           #5                  // String c
      18: aastore
      19: astore_1
      20: new           #6                  // class java/lang/StringBuilder
      23: dup
      24: invokespecial #7                  // Method java/lang/StringBuilder."":()V
      27: astore_2
      28: iconst_0
      29: istore_3
      30: iload_3
      31: aload_1
      32: arraylength
      33: if_icmpge     50
      36: aload_2
      37: aload_1
      38: iload_3
      39: aaload
      40: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      43: pop
      44: iinc          3, 1
      47: goto          30
      50: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
      53: aload_2
      54: invokevirtual #10                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      57: return

可以發(fā)現(xiàn)在由30: iload_347: goto 30構(gòu)成的循環(huán)體內(nèi)沒有new操作,而是放到了循環(huán)外部
20: new #6 // class java/lang/StringBuilder

由此得出,在循環(huán)時使用+=會創(chuàng)建多個StringBuilder對象,而使用append(),只會創(chuàng)建一個。
所以我們在平時寫代碼的時候一定注意,不要再循環(huán)中使用+=操作,效率很低的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73363.html

相關(guān)文章

  • jQuery DOM節(jié)點創(chuàng)建、插入、刪除

    摘要:通過方法添加的元素剛好相反,內(nèi)容在方法前面,無論是一個選擇器表達式或創(chuàng)建作為標(biāo)記上的標(biāo)記它都將被插入到目標(biāo)容器的末尾。主要的不同是語法特別是插入內(nèi)容和目標(biāo)的位置。 DOM節(jié)點的創(chuàng)建 DOM創(chuàng)建節(jié)點及節(jié)點屬性 首先,介紹如何使用JavaScript創(chuàng)建div節(jié)點元素,主要包括創(chuàng)建div節(jié)點元素的屬性和創(chuàng)建div節(jié)點元素的樣式兩大部分內(nèi)容 創(chuàng)建流程: 創(chuàng)建節(jié)點(常見的:元素、屬性和文本)...

    rainyang 評論0 收藏0
  • java學(xué)習(xí)(六) —— java中StringStringBuffer區(qū)別

    摘要:中有三個類可以對字符進行操作是進行單個字符操作的類。類中的方法偏重于對字符串的變化,例如追加插入和刪除等,這個也是和類的主要區(qū)別。類屬于一種輔助類,可預(yù)先分配指定長度的內(nèi)存塊建立一個字符串緩沖區(qū)。 前言 String和StringBuffer都是java中關(guān)于字符操作的類 尤其String,經(jīng)??吹筋愃七@樣的賦值代碼 String str = Hello World,看起來就好像in...

    Paul_King 評論0 收藏0
  • String, StringBufferStringBuilder

    摘要:在中,是不可變類型,所以對于字符串的操作提供了兩個輔助類和??紤]如下代碼在利用直接進行拼接時,每次循環(huán)都會生成一個新的對象,也就是說等同這樣運行的效率明顯是低于顯式調(diào)用的。 在Java中,String是不可變類型,所以對于字符串的操作提供了兩個輔助類:StringBuffer和StringBuilder。 這個兩個類的主要區(qū)別在于: StringBuilder的效率更高 Stri...

    cartoon 評論0 收藏0
  • python“=”與C++區(qū)別

    摘要:先來看中普通變量傳值對于普通變量和是一樣的,接下來看看的列表由此可以看到傳值時,傳遞的是指針。由于中的元組相當(dāng)與中的常量數(shù)組,不分析元組,接下來看看中的字典變量字典中傳遞的也是地址,接下來看看一種特殊的字典,即字典中對應(yīng)的值是個 先來看python中普通變量傳值 data1=1 data2=data1 data2+=1 print data2,data1 2 1 對于普通變量pytho...

    lewif 評論0 收藏0
  • 為什么不建議在for循環(huán)中使用"+"進行字符串拼接

    摘要:使用可以方便的對字符串進行拼接。該方法使用進行聲明,說明是一個線程安全的方法。所以,阿里巴巴開發(fā)手冊建議循環(huán)體內(nèi),字符串的連接方式,使用的方法進行擴展。但是,還要強調(diào)的是如果不是在循環(huán)體中進行字符串拼接的話,直接使用就好了。 摘要: 學(xué)習(xí)阿里巴巴Java開發(fā)手冊。 原文:為什么阿里巴巴不建議在for循環(huán)中使用+進行字符串拼接 微信公眾號:Hollis Fundebug經(jīng)授權(quán)轉(zhuǎn)載,...

    caoym 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<