摘要:和的區別是面試中出現頻率較高的一個題目了,下面我們就來分析一下這兩者的區別吧。所以我們在平時寫代碼的時候一定注意,不要再循環中使用操作,效率很低的。
“+=”和append的區別是面試中出現頻率較高的一個題目了,下面我們就來分析一下這兩者的區別吧。
首先看一下這段代碼的結果:
String s1 = "a"; String s2 = s1 + "b"; System.out.println(s2 == "ab"); // false
輸出結果是false;
javap將其反編譯之后的結果如下:
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
根據結果我們可以看到:
虛擬機開始是定義了一個字符串”a“將其入棧;
然后new了一個StringBuilder對象,將”a“封裝到Sb對象中;
之后用StringBuilder的append()方法來完成"a"和"b"的拼接;
所以這里的"ab"字符串本質上是一個StringBuilder對象,所以再去跟常量"ab"去比較的話會是false;
這樣看來用"+"和append效率似乎是一樣的,并沒有像網上說的那樣”+“操作比append()更消耗性能。
那下面我們來看一下這兩者在循環中是什么結果:
首先是”+=“操作:
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); }
反編譯結果如下:
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_3和55: goto 25兩句構成了一個循環,而31: new #7 // class java/lang/StringBuilder創建StringBuilder對象語句在循環內,所以會創建多個
SB對象;
下面我們把代碼改為append()實現:
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
可以發現在由30: iload_3和47: goto 30構成的循環體內沒有new操作,而是放到了循環外部
20: new #6 // class java/lang/StringBuilder
由此得出,在循環時使用+=會創建多個StringBuilder對象,而使用append(),只會創建一個。
所以我們在平時寫代碼的時候一定注意,不要再循環中使用+=操作,效率很低的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73363.html
摘要:通過方法添加的元素剛好相反,內容在方法前面,無論是一個選擇器表達式或創建作為標記上的標記它都將被插入到目標容器的末尾。主要的不同是語法特別是插入內容和目標的位置。 DOM節點的創建 DOM創建節點及節點屬性 首先,介紹如何使用JavaScript創建div節點元素,主要包括創建div節點元素的屬性和創建div節點元素的樣式兩大部分內容 創建流程: 創建節點(常見的:元素、屬性和文本)...
摘要:中有三個類可以對字符進行操作是進行單個字符操作的類。類中的方法偏重于對字符串的變化,例如追加插入和刪除等,這個也是和類的主要區別。類屬于一種輔助類,可預先分配指定長度的內存塊建立一個字符串緩沖區。 前言 String和StringBuffer都是java中關于字符操作的類 尤其String,經常看到類似這樣的賦值代碼 String str = Hello World,看起來就好像in...
摘要:在中,是不可變類型,所以對于字符串的操作提供了兩個輔助類和。考慮如下代碼在利用直接進行拼接時,每次循環都會生成一個新的對象,也就是說等同這樣運行的效率明顯是低于顯式調用的。 在Java中,String是不可變類型,所以對于字符串的操作提供了兩個輔助類:StringBuffer和StringBuilder。 這個兩個類的主要區別在于: StringBuilder的效率更高 Stri...
摘要:先來看中普通變量傳值對于普通變量和是一樣的,接下來看看的列表由此可以看到傳值時,傳遞的是指針。由于中的元組相當與中的常量數組,不分析元組,接下來看看中的字典變量字典中傳遞的也是地址,接下來看看一種特殊的字典,即字典中對應的值是個 先來看python中普通變量傳值 data1=1 data2=data1 data2+=1 print data2,data1 2 1 對于普通變量pytho...
摘要:使用可以方便的對字符串進行拼接。該方法使用進行聲明,說明是一個線程安全的方法。所以,阿里巴巴開發手冊建議循環體內,字符串的連接方式,使用的方法進行擴展。但是,還要強調的是如果不是在循環體中進行字符串拼接的話,直接使用就好了。 摘要: 學習阿里巴巴Java開發手冊。 原文:為什么阿里巴巴不建議在for循環中使用+進行字符串拼接 微信公眾號:Hollis Fundebug經授權轉載,...
閱讀 2135·2021-10-14 09:43
閱讀 2197·2019-08-30 15:55
閱讀 726·2019-08-30 14:23
閱讀 2019·2019-08-30 13:21
閱讀 1235·2019-08-30 12:50
閱讀 2199·2019-08-29 18:46
閱讀 2280·2019-08-29 17:28
閱讀 2359·2019-08-29 17:21