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. 