簡體   English   中英

Java中的字符串連接和自動裝箱

[英]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()
  • 這里不涉及自動裝箱,因為有一個StringBuilder.append(int)方法,根據文檔使用String.valueOf(int)來創建整數的字符串表示。

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.

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