Dúvida a respeito de String criadas na heap

Olá pessoal no livro da kathy, estou estudando sobre Strings (cap 6). Em um determinado momento tem um trecho de código que lança um desafio, descobrir quando Strings e referências foram criadas:

String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat("fall ");
s2.concat(s1);
s1 += "winter ";
System.out.println(s1 + " " + s2);

No livro diz que a resposta é 8 objetos Strings criados, porém eu contei 9! Eu considerei a String criado no sout. Ai fiquei na dúvida, é criado uma nova String no sout? Pois caso positivo o livro está errado =P

String s1 = "spring "; // a string já está criada antes de chegar a esta linha
String s2 = s1 + "summer "; // criada a string "spring summer" - (1)
s1.concat("fall "); // criada a string "spring summer fall" - (2) - essa string já ficou disponível para garbage collection
s2.concat(s1); // criada a string "spring summer spring " - (3) - mesma coisa
s1 += "winter "; // criada a string ("spring winter") - (4) - note que a string anterior "spring " não está mais referenciada,
System.out.println(s1 + " " + s2); // criada a string ("spring winter spring summer ") - (5) - essa string é usada pelo println, e depois desprezada

Esquisito, contei só 5 - a expressão s1 + " " + s2 é equivalente a:

new StringBuilder (s1).append (" ").append(s2).toString();

que cria apenas uma nova string, não 2 como seria de se esperar. Sei lá, acho que também não estou sabendo contar direito :slight_smile:

entanglement, no mínimo 8 tem, eu contei 9…

String s1 = "spring "; // 1 - spring
String s2 = s1 + "summer "; // 2 ? summer, 3 ? spring summer
s1.concat("fall "); // 4 ? fall, 5 ? spring fall
s2.concat(s1); // 6 ? spring summer spring
s1 += "winter "; // 7 ? winter, // 8 ? spring winter
System.out.println(s1 + " " + s2); // 9 ? spring winter spring summer
                                   // essa ultima String o livro não conta

Descartando as otimizações (que o entanglement levou em conta), eu contei 10. Agora, sem a linha do println, são só 8 mesmo.

Sempre tive duvidas aqui tbm

mais ao meu modo de ver


String s1 = "spring ";  // 1º Primeiro Objeto

String s2 = s1 + "summer ";  // 2 º,  3º  objetos "summer" e "spring summer"

s1.concat("fall ");  // 4º objeto que neste caso fica sem refencia "fall" 5º quinto objeto tbm é criado e fica sem referencia "Spring fall"

s2.concat(s1);   // 6º objeto que tambem fica sem referencia "spring summer spring" aqui só é criado um objeto porque "s1" ja existe na memoria ao contrario de "fall" que foi criado  logo acima

s1 += "winter "; // o mesmo que s1 = s1 + "winter" ou seja 7º e 8º  objetos criados