[英]String Concatenation and Autoboxing in Java
當您將String與諸如int之類的基元連接在一起時,它是否首先對該值進行自動標記 。
恩。
String string = "Four" + 4;
它如何將值轉換為Java中的字符串?
要查看Java編譯器生成的內容,使用javap -c
顯示生成的實際字節碼總是有用的:
例如,以下Java代碼:
String s1 = "Four" + 4;
int i = 4;
String s2 = "Four" + i;
會產生以下字節碼:
0: ldc #2; //String Four4
2: astore_1
3: iconst_4
4: istore_2
5: new #3; //class java/lang/StringBuilder
8: dup
9: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
12: ldc #5; //String Four
14: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/
String;)Ljava/lang/StringBuilder;
17: iload_2
18: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lan
g/StringBuilder;
21: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/la
ng/String;
24: astore_3
25: return
從中我們可以看到:
"Four" + 4
的情況下,Java編譯器(我使用的是JDK 6)非常聰明地推斷出這是一個常量,因此在運行時沒有計算工作,因為字符串在編譯時連接 "Four" + i
的情況下,等效代碼是new StringBuilder().append("Four").append(i).toString()
java編譯器實際上創建了一個StringBuilder
1並調用了append()
方法。 它可以在字節碼中看到:
22 invokespecial java.lang.StringBuilder(java.lang.String) [40]
...
29 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [47]
32 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [51]
然而,行為與裝箱相同,然后調用toString()
: "Four" + new Integer(4).toString()
- 我相信語言設計者的想法。
(1)確切地說, 編譯器已經將字符串文字和int literal連接到單個字符串文字"Four4"
。 您可以在字節代碼中的以下行的字節代碼中看到它:
0 ldc <String "Four4"> [19]
根據http://jcp.org/aboutJava/communityprocess/jsr/tiger/autoboxing.html ,只要需要引用類型(例如本例中的Integer類),就會對基本類型進行自動裝箱。
因此int將被轉換為Integer,然后調用整數對象toString()方法,並將其結果附加到前面的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.