La respuesta está ligada a implementaciones específicas del lenguaje (compilador y bibliotecas de tiempo de ejecución). Incluso a la presencia de opciones de optimización específicas o no. Y, por supuesto, la versión de la implementación (e, implícitamente, la JLS con la que cumple). Por lo tanto, es mejor hablar en términos de mínimos y máximos. De hecho, este ejercicio da una mejor
Para Ex1, el número mínimo de objetos es 1 (el compilador se da cuenta de que solo hay constantes involucradas y produce solo código para String s= "abc" ;
). El máximo podría ser cualquier cosa, dependiendo de la implementación, pero una estimación razonable es 8 (también se da en otra respuesta como el número producido por cierta configuración).
Para Ex2, el número mínimo de objetos es 2. El compilador no tiene forma de saber si hemos reemplazado StringBuilder con una versión personalizada con semántica diferente, por lo que no se optimizará. El máximo podría ser alrededor de 6, para una implementación de StringBuilder extremadamente conservadora de la memoria que expande una matriz de respaldo char[]
un carácter a la vez, pero en la mayoría de los casos será 2 también.
El primer ejemplo creará 1 objeto ya que el compilador puede optimizarlo. –
javac optimizará eso? –
El ejemplo 1 genera esto: 'String s =" a "; s = (nuevo StringBuilder (String.valueOf (s))). Append ("b"). ToString(); s = (new StringBuilder (String.valueOf (s))). Append ("c"). ToString(); System.err.println (s); '. Parece que javac no está optimizando eso (al menos en Java 6) –