2011-12-20 9 views
5

Descubrí que Java supports constant folding of primitive types, pero ¿qué hay de String s?¿El compilador Java incluye String Constant Folding?

Ejemplo

Si creo el siguiente código

out.write("" 
     + "<markup>" 
     + "<nested>" 
     + "Easier to read if it is split into multiple lines" 
     + "</nested>" 
     + "</markup>" 
     + ""); 

Qué entra en el código compilado?

¿Versión combinada? out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

¿O la versión menos eficiente de concatenación en tiempo de ejecución? out.write(new StringBuilder("").append("<markup>").append("<nested>").append("Easier to read if it is split into multiple lines").append("</nested>").append("</markup>").append(""));

+0

La concatenación de cadenas es aproximadamente 100 veces más rápida que escribir en un dispositivo. Realmente no importaría mucho si no lo hiciera (pero lo hace) –

+0

Acabo de probarlo en mi computadora portátil y es 50 veces más lento. –

+1

En realidad, es el comportamiento requerido por el JLS./Puede ver el código generado con 'javap -c'. –

Respuesta

14

Aquí es una prueba sencilla:

public static void main(final String[] args) { 
    final String a = "1" + "2"; 
    final String b = "12";   

    System.out.println(a == b); 
} 

Salida:

true 

Así que, sí, el compilador veces.

-1

Es efectivamente se traduce en: out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

1

Se usará la versión combinada .
El compilador lo optimiza automáticamente y lo coloca en el grupo de cadenas.

Puede probar este comportamiento fácilmente escribiendo esta línea.

System.out.println("abc" == "a" + ("b" + "c")); // Prints true 

Que esto imprime cierto, significa que son los mismos objetos . Esto es debido a dos cosas:

  1. El compilador optimizado "a" + ("b" + "c")-"abc".
  2. El compilador coloca todos los literales de cadena en el grupo de cadenas. Este comportamiento se llama String Interning.
+1

La primera parte de este comportamiento se llama evaluación de expresión constante. – EJP