I tienen el siguiente códigoconcatenación de cadenas con Null
System.out.println("" + null);
y la salida es null
.
¿Cómo funciona Java en la concatenación de cadenas?
I tienen el siguiente códigoconcatenación de cadenas con Null
System.out.println("" + null);
y la salida es null
.
¿Cómo funciona Java en la concatenación de cadenas?
Debido Java convierte la expresión "A String" + x
a algo en la línea de "A String" + String.valueOf(x)
En realidad, creo que probablemente usa StringBuilder
s, de modo que:
"A String " + x + " and another " + y
la resolución a los más eficientes
new StringBuilder("A String ")
.append(x)
.append(" and another ")
.append(y).toString()
Esto usa los métodos append
en el generador de cadenas (para cada tipo), que h andle null
correctamente
Java usa StringBuilder.append(Object obj)
detrás de escena.
No es difícil imaginar su implementación.
public StringBuilder append(Object obj)
{
if (obj == null)
{
append("null");
}
else
{
append(obj.toString());
}
return this;
}
Enlace a la implementación: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/StringBuilder.java#170 –
El código "" + null
es convertido por el compilador para
new StringBuffer().append("").append(null);
y StringBuffer reemplaza nula con la cadena "nula". Entonces el resultado es la cadena "nula".
Solo una pequeña corrección; ahora es StringBuilder no StringBuffer. La seguridad del subproceso no es una preocupación con la concatenación de cadenas (durante la vida útil del constructor de todos modos). –
¿Por qué querría/necesitaría escribir '" "+ null' en lugar de simplemente' "nulo" '? ¿Ese ejemplo es solo para ejercicio académico? – user46874
@ user46874: creo que debe haber sido un experimento para ver cómo se imprimen los nulos. –
IIRC, en realidad no golpea 'String.valueOf (y)'. Hay sobrecargas de 'StringBuilder.append' para cada tipo posible, y' append (Object) 'maneja el nulo directamente. Sin embargo, puede reemplazar el "Creo que probablemente" con "eso". –
Sí, soy viejo skool, me temo, desde el día en que la concatenación de cadenas no era perfecta. –
Acaba de inspeccionar el código para 'append (Object)', y de hecho delega a 'String.valueOf()'. * Dentro * el método sin embargo. Entonces se reducen a las mismas llamadas. –