Raciocínio pool Strings

galera… tava relembrando alguns conceitos relacionados a Strings… vou colocar uns textos aqui e quero ver se vcs concordam.

String s = "abcd";

nesse caso é criado 1 objeto “abcd” que é atribuído a variável s e inserido no pool. Caso outra string seja criada com este valor:

String t = "abcd";

o pool informará que já existe um objeto criado com o mesmo valor e as variáveis s e t referenciarão o mesmo objeto no pool

Agora quando fizermos:

String s = new String("abcd");

estaremos forçando a JVM a criar um novo objeto String na memória, mas TAMBÉM será criado este objeto no pool, ou seja, 2 objetos serão criados, porém s estará apontando para o objeto da memória.

Agora se criarmos outro objeto

String t = new String("abcd");

neste caso fará o mesmo que s, só que criará apenas 1 objeto, sendo este na memória em que t referenciará. “abcd” não será criado no pool porque já existe essa constante por lá, só que s e t não referenciam o mesmo valor porque ambas as variáveis referenciam um endereço na memória cada uma e não valores que estão no pool.

Está correto?

me corrijam se eu estiver errado

grato

Eu acho que String s = “A” ou String s = new String(“A”) são a mesma coisa, você só teria objetos diferentes se usasse o clone, não?

testei com o == e os dois referenciam objetos distintos

no fim da citacao o java criou 3 objetos…

soh q “abcd” nao esta referenciado dae o garbage collector vai apagar ele…
soh o s e o t q estao

mas criou tres sim

afinal isso aki:


       public static void main(String[] args) {
           String s = new String("abcd");
           String t = new String("abcd");
           
           System.out.println(s==t);
           System.out.println(s=="abcd");
           System.out.println(t=="abcd");
          
       }

retorna tudo false

esse objeto que o garbage collector vai apagar é o objeto que está no pool correto? Agora uma dúvida… como vou saber se são 3 ou são 4? quando instancio s conforme tu fez, criam-se 2 objetos… 1 no pool sem referencia a ele e 1 na memoria correto? agora qdo crio t, o objeto criado no pool para s pode ter sido recolhido ou nao… se tiver sido recolhido, mais 1 objeto criado, caso não, somente o objeto da memoria será criado para t correto?

A classe String segue o padrão flyweight.

[code]public static void main(String args[]) {
String s1 = “abcd”;
String t1 = “abcd”;
System.out.println(“s1 e t1 " + (s1==t1?”":" não") + " estão apontando para o mesmo objeto do Pool de Strings.");

String s2 = new String("abcd"); 
String t2 = new String("abcd"); 
System.out.println("s2 e t2 " + (s2==t2?"":"não") + " estão apontando para o mesmo objeto do Pool de Strings.");

}[/code]

Quando você dá um new, ou concatena duas strings, ele irá criar outro objeto no pool e apontar a variável para este objeto.
É o mesmo conceito aplicado para explicar porque == não funciona com Strings. :wink: