2012-09-16 12 views
5

Po połączeniu łańcucha z elementem pierwotnym, takim jak int, należy najpierw podać wartość.Łączenie ciągów i Autoboxing w Javie

np.

String string = "Four" + 4; 

Jak to przekonwertować wartości ciągu w Java?

+0

W jakim języku się posługujesz? – skunkfrukt

+0

Wygląda Java mi – TeaOverflow

+0

jeśli mówimy o C#, zajrzeć tutaj: [ciąg concat] [1] [1]: http: // stackoverflow.com/questions/3398604/string-string-int-whats-behind-the-scene-c – meirrav

Odpowiedz

5

Aby zobaczyć, co kompilator Javy produkuje zawsze jest przydatne do korzystania javap -c pokazać rzeczywistą kodu bajtowego Produkcja:

Na przykład następujący kod Java:

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

da następujący kod bajtowy:

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 

Z tego możemy zobaczyć:

  • W przypadku "Four" + 4, kompilator Javy (używałem JDK 6) był na tyle sprytny, aby wywnioskować, że jest to stała, więc nie ma obliczeniowa wysiłek w czasie wykonywania, ponieważ ciąg jest łączony w czasie kompilacji
  • W przypadku "Four" + i, równoważny kod to new StringBuilder().append("Four").append(i).toString()
  • Autoboxing nie jest tutaj zaangażowany, ponieważ istnieje metoda StringBuilder.append(int), która zgodnie z dokumentami używa String.valueOf(int) do utworzenia reprezentacji łańcuchowej liczby całkowitej.
4

Kompilator java faktycznie tworzy StringBuilder i wywołuje metodę append(). Można zauważyć w bajtowego kodu:

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] 

Mimo to zachowanie jest identyczne jak boks, a następnie powołując toString(): "Four" + new Integer(4).toString() - co wierzę, co projektanci język miał na myśli.


(1) Ściślej The kompilator już concatting łańcuch dosłownym INT dosłownym do jednego łańcuch znaków "Four4". Można zobaczyć go w kodu bajtowego w poniższej linii w bajtowego kodu:

0 ldc <String "Four4"> [19] 
Powiązane problemy