2012-09-16 7 views
5

Wenn Sie eine Zeichenfolge mit einem primitiven wie Int verknüpfen, tut es Autobox der Wert zuerst.Zeichenfolge Verkettung und Autoboxing in Java

ex.

String string = "Four" + 4; 

Wie es den Wert in eine Zeichenfolge in Java konvertiert?

+0

Welche Sprache verwenden Sie? – skunkfrukt

+0

Sieht aus wie Java mir – TeaOverflow

+0

, wenn Ihr über C# sprechen, schauen Sie hier in: [string concat] [1] [1]: http: // Stackoverflow.com/questions/3398604/string-string-int-was-hinter-der-szene-c – meirrav

Antwort

5

Um zu sehen, was die Java-Compiler erzeugen es immer nützlich ist javap -c zu verwenden, um die tatsächlichen Bytecode erzeugt zeigen:

Für das folgende Java-Codebeispiel:

String s1 = "Four" + 4; 
int i = 4; 
String s2 = "Four" + i; 

die folgenden Bytecode erzeugen würde:

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 

Daraus können wir sehen:

  • Im Fall von "Four" + 4, die Java-Compiler (I wurde JDK 6 mit) waren klug genug, um zu folgern, dass dies eine Konstante ist, so gibt es keinen Rechenaufwand zur Laufzeit, da die Zeichenfolge bei der Kompilierung verkettet
  • Im Fall von "Four" + i ist der entsprechende Code new StringBuilder().append("Four").append(i).toString()
  • Autoboxing ist hier nicht beteiligt, da es eine StringBuilder.append(int) Methode gibt, die nach den Dokumenten String.valueOf(int) verwendet, um die Zeichenfolgendarstellung der Ganzzahl zu erstellen.
4

Der Java-Compiler erstellt tatsächlich eine StringBuilder und ruft die append() Methode auf. Es kann in dem Byte-Code zu sehen:

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] 

Dennoch ist das Verhalten identisch mit Boxen und dann Aufruf toString(): "Four" + new Integer(4).toString() - was ich glaube, was die Sprache Designer im Sinne hatte.


(1) Um genau zu sein, die Compiler bereits concatting die Stringliteral und int wörtliche zu einem einzigen Stringliteral "Four4". Sie können es in dem Byte-Code in der folgenden Zeile in Byte-Code sehen:

0 ldc <String "Four4"> [19] 
Verwandte Themen