¿Cuántos objetos de cadena se crearán en la memoria?

¿Cuántos objetos de cadena se crearán con el siguiente código?

String s=""; s+=new String("a"); s+="b"; 

Tuve esta pregunta en el examen. Quiero saber la respuesta correcta. Dije 2 objetos.
El objeto del conjunto que contiene “”, “b” y el objeto creado por el nuevo String (“a”);

Empezaré por otra pregunta más clara: cuántas instancias de String están involucradas en el siguiente fragmento de código:

 String s=""; s+=new String("a"); s+="b"; 

Y la respuesta es 6:

  • el literal de String vacío: "" ;
  • la Cadena literal "a" ;
  • la copia de la Cadena literal “a”: new String("a") ;
  • la Cadena creada por concatenación y la copia de "a" ;
  • la cadena literal "b"
  • la Cadena creada al concatenar s y "b" .

Si supone que los tres literales de Cadena ya han sido creados por el código previamente cargado, el fragmento de código crea 3 nuevas instancias de Cadena.

String s = “”;

no crea objetos

s + = new String (“a”);

crea cinco objetos el new String , el StringBuilder y su char [] y el String resultante y su char []

s + = “b”;

crea cuatro objetos, el StringBuilder y su char [] y el String resultante y su char []

Así que obtengo un total de nueve objetos de los cuales son tres objetos String

Nota: Puede estar seguro de que “” ya se ha cargado como aparece en muchas clases del sistema, incluidos ClassLoader y Class.

Las cadenas “a” y “b” pueden o no considerarse como nuevas cadenas a los fines de esta pregunta. En mi humilde opinión, no los contaría, ya que solo se crearán a lo sumo una vez y si este código solo se ejecuta una vez, no importa cuántas cadenas se creen. Lo que es más probable que sea útil es saber cuántos objetos se crean cada vez que se ejecuta el código.

La cantidad de objetos realmente creados en una situación JITC es indeterminada. El JITC bien puede reconocer que una new String("a") es una identidad, y que no se hace referencia a ningún valor intermedio de s , de modo que solo se crea StringBuilder. Hay varios efectos secundarios potenciales que deben imitarse en el caso general (por ej., Cuando el argumento de una new String() puede no ser válido), pero con literales no pueden ocurrir.

De hecho, javac podría reconocer que el resultado es “ab”, sin efectos secundarios potenciales, y solo produce un literal String de ese valor. (Se combina la cadena en casos ligeramente menos complicados).

Creando nuevas cadenas

Anteriormente nos comprometimos a hablar más sobre las diferencias sutiles entre los diversos métodos de creación de una cadena. Veamos un par de ejemplos de cómo se podría crear una Cadena, y supongamos además que no existen otros objetos de Cadena en la agrupación:

 String s = "abc"; // creates one String object and one reference variable 

En este caso simple, “abc” irá al grupo y s se referirá a él.

 String s = new String("abc"); // creates two objects, and one reference variable 

En este caso, debido a que usamos la new palabra clave, Java creará un nuevo objeto String en la memoria normal (no compartida) y s se referirá a ella. Además, el literal “abc” se colocará en el grupo.

De SCJP Sun Certified Programmer for Java 6 Guía de estudio (Examen 310-065) .pdf