lgi2020:
[…
Amigo,
A String “testando…” será usada em todos os N objetos String que existirem e também nos sysout, concatenações…
Isso é o que eu entendo por funcionamento das Strings em Java.
Podemos não ter nenhum objeto referenciando a String.
Mas enquanto ela não for varrida do pool, qualquer novo objeto a utilizará.
De qualquer forma, embora ache que estou certo, não sou o dono absoluto da verdade e do conhecimento.
Aceito críticas e correções!
Abraços a todos.
Então, humanamente poderia se pensar assim, mas a JVM não trabalha dessa maneira. Em qualquer classe de objeto, uma criação explícita (
new Blablabla() ) gera sempre um novo objeto. A diferença é que em String e Integer ( não lembro se em outros Wrappers funciona de maneira semelhante ), há um pool de reaproveitamento, pois esses objetos consomem muita memória e para facilitar esse mecanismo, existe a criação implicita ( sem o uso do new ). Independentemente do conteúdo ser idêntico, os objetos não necessariamente serão. No caso:
String teste1 = new String("teste");
String teste2 = "teste";
Haverá somente 1 objeto “teste” no pool, pois na primeira linha, esse objeto é criado de qualquer maneira por causa do new, na segunda linha, antes de tentar criar, ele irá varrer o pool e procurar por um objeto de conteúdo idêntico e como vai achar, ele somente vai referenciar o mesmo objeto.
Num segundo caso:
String teste3 = "agora";
String teste4 = new String("agora");
Haverão 2 objetos com o mesmo conteúdo. Primeiro ele varre o pool, não encontra um objeto semelhante e cria-o. Depois, independente do pool, um novo objeto será criado com o conteúdo idêntico.
Agora, mesmo que não haja nenhuma referência apontando esses objetos, eles não serão liquidados logo, devendo esperar pela passagem do garbage collector ( na verdade, 2 passagens, mas isso é motivo para outro tópico ), podendo assim serem reaproveitados.
Até!