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 
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