簡體   English   中英

stringbuilder調用中的Java字符串concat

[英]Java string concat in stringbuilder call

據我所知,StringBuilder通過在concats期間不在字符串池中創建臨時字符串實例來幫助減少內存使用量。 但是,如果我這樣做會發生什么:

StringBuilder sb = new StringBuilder("bu");
sb.append("b"+"u");

它編譯成了嗎?

sb.append("b");
sb.append("u");

或者它取決於優化標志? 或者,如果使用stringbuilders,我會失去整個好處? 或者這個排隊沒有意義? :)

它編譯為sb.append("bu") ,因為編譯器將多個String litterals的串聯轉換為單個String litteral。

如果你有

String a = "a";
sb.append(a + "b");

它會編譯成

String a = "a";
String temp = a + "b"; // useless creation of a string here
sb.append(temp);

所以你應該更喜歡

sb.append(a);
sb.append("b");

在這種情況下。

由於"b" + "u"是在編譯時計算的表達式,因此它將被編譯為就像你有"bu"

 0: new #2; //class StringBuilder
 3: dup
 4: ldc #3; //String bu
 6: invokespecial   #4; //Method StringBuilder."<init>":(String;)V
 9: astore_1
10: aload_1
11: ldc #3; //String bu
13: invokevirtual   #5; // StringBuilder.append:(String;)LStringBuilder;

另一方面,如果您有兩個字符串變量,則此優化不會啟動:

以下片段......

StringBuilder sb = new StringBuilder("bu");
String b = "b", u = "u";

sb.append(b + u);

...編譯為:

0:  new #2; //class StringBuilder
3:  dup
4:  ldc #3; //String bu
6:  invokespecial   #4; //Method StringBuilder."<init>":(String;)V
9:  astore_1
10: ldc #5; //String b
12: astore_2
13: ldc #6; //String u
15: astore_3
16: aload_1
17: new #2; //class StringBuilder
20: dup
21: invokespecial   #7; //Method StringBuilder."<init>":()V
24: aload_2
25: invokevirtual   #8; //Method StringBuilder.append:(String;)StringBuilder;
28: aload_3
29: invokevirtual   #8; //Method StringBuilder.append:(String;)StringBuilder;
32: invokevirtual   #9; //Method StringBuilder.toString:()String;
35: invokevirtual   #8; //Method StringBuilder.append:(String;)StringBuilder;

即類似的東西

StringBuilder sb = new StringBuilder("bu");
String b = "b", u = "u";

StringBuilder temp = new StringBuilder();
temp.append(b);
temp.append(b);
String result = temp.toString();

sb.append(result);

正如您在第17-21行中所看到的,創建了一個額外的StringBuilder ,用於連接ab 然后,在第32行獲取此臨時StringBuilder的結果String ,並將其附加到第35行的原始StringBuilder


(字節碼是由javap命令生成的,它是JDK的一部分。嘗試一下,它非常簡單!)

不, "b" + "u"將創建一個不可變的b字符串,一個不可變的u字符串,然后創建一個傳遞給StringBuilder實例的第三個不可變的bu字符串。

錯誤:

StringBuilder sb = new StringBuilder();
sb.append("b"+"u");

正確:

StringBuilder sb = new StringBuilder();
sb.append("b").append("u");

BEST://因為你已經知道那里會發生什么了! ;)

StringBuilder sb = new StringBuilder();
sb.append("bu");

:)

編輯

我猜我上面的答案在處理文字時是不正確的......

:/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM