Raciocínio pool Strings

5 respostas
CarlosEduardoDantas

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

5 Respostas

RaulCarlin

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?

CarlosEduardoDantas

testei com o == e os dois referenciam objetos distintos

JimMorrison

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

CarlosEduardoDantas

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?

acdesouza

A classe String segue o padrão flyweight.

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.");
}

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:

Criado 27 de setembro de 2007
Ultima resposta 27 de set. de 2007
Respostas 5
Participantes 4