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 ?
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 ?
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:
"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"Four" + i
, el código equivalente es new StringBuilder().append("Four").append(i).toString()
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]
Según http://jcp.org/aboutJava/communityprocess/jsr/tiger/autoboxing.html, autoboxing se realiza en el tipo primitivo siempre se necesita un tipo de referencia (por ejemplo, la clase de enteros en este caso)
Por lo tanto, el int se convertirá en un entero, luego se llama a los objetos enteros al método de cadena() y su resultado se agrega a la cadena anterior.
¿Qué idioma estás usando? Parece que – skunkfrukt
Java para mí – TeaOverflow
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