2012-09-16 81 views
5

Cuando concatena una cadena con una primitiva como int, lo hace autobox el valor primero.Concatenación de cadenas y Autoboxing en Java

ex.

String string = "Four" + 4; 

¿Cómo convertir el valor en una cadena en Java ?

+0

¿Qué idioma estás usando? Parece que – skunkfrukt

+0

Java para mí – TeaOverflow

+0

si su hablando de C#, mira aquí: [concat cadena] [1] [1]: http: // stackoverflow.com/questions/3398604/string-string-int-whats-behind-the-scene-c – meirrav

Respuesta

5

Para ver lo que el compilador de Java produce siempre es útil el uso de javap -c para mostrar el código de bytes real producido:

Por ejemplo el siguiente código Java:

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

produciría el siguiente código de bytes:

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 

De esto podemos ver:

  • En el caso de "Four" + 4, el compilador de Java (que estaba usando JDK 6) era lo suficientemente inteligente como para deducir que se trata de una constante, por lo que no hay ningún esfuerzo computacional en tiempo de ejecución, como la cadena se concatena en tiempo de compilación
  • en el caso de "Four" + i, el código equivalente es new StringBuilder().append("Four").append(i).toString()
  • Autoboxing no está involucrado aquí, ya que es un método StringBuilder.append(int) que según los documentos está utilizando String.valueOf(int) para crear la representación de cadena del número entero.
4

El compilador de Java realmente crea un StringBuilder e invoca el método append(). Se puede ver en el código de bytes:

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] 

Sin embargo, el comportamiento es idéntico al boxeo y luego invocar toString(): "Four" + new Integer(4).toString() - que creo que lo que los diseñadores del lenguaje tenían en mente.


(1) Para ser exactos, el compilador ya está concatting la cadena literal e int literal a una sola cadena literal "Four4". Se puede ver en el código byte en la línea siguiente en el código de bytes:

0 ldc <String "Four4"> [19]