[英]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
,用於連接a
和b
。 然后,在第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.