Declaração String [resolvido]

Oi gente. Existe varias formas para se declarar uma variavel de referência de um objeto String, inclusive a literal.

String n1 = “Nome”;

queria saber se é a IDE ou a JVM que fará o trabalho de instanciação para a gente.

Ela vai considerar o String n1 = “Nome” e fará automaticamente a instanciação de um objeto para a gente, String n1 = new String(“Nome”); ?

Isso mesmo.
Com a diferença que literais compartilham memória.

Isso é:

String s1 = "Nome"; String s2 = "Nome";

Equivale a:

String s1 = new String("Nome"); String s2 = s1;

Como strings são imutáveis, isso não é exatamente um problema.

Eu li alguma coisa sobre isso que diz:

[quote]Tendo em vista que programas e Strings literais tendem a crescer, e que podem haver várias Strings literais idênticas compartilhando a mesma memória, a JVM reserva uma área denominada de String constant pool (pool constante de Strings). Sempre que uma nova literal (por exemplo: String x = “java”:wink: é criada, o compilador verifica o pool para ver se encontra uma literal String idêntica à que foi criada. Se o compilador encontrar, nenhuma literal é criada, e a literal que já existia no pool terá uma nova referência.

É esta a razão da imutabilidade de objetos do tipo String. Imaginem o cenário:

Temos várias variáveis de referência apontando para a mesma String.

Se uma delas pudesse modificar o valor dela, as outras variáveis nem saberiam dessa modificação, ocasionando um grande problema no sistema.[/quote]

Agora sobre isso vou fazer algumas considerações segundo eu entendi:

1 - Todas as strings literais se encontra em um local chamado String constant pool.

2 - Quando criado uma string literal o compilado verifica nesse local se existe alguma String literal igual, se sim, a string literal s1 = “Nome”; (s1 deixará de apontar para “Nome”, s2 agora é que apontará para “Nome”) s2 = “Nome”?

[quote=Sleipbr]2 - Quando criado uma string literal o compilado verifica nesse local se existe alguma String literal igual, se sim, a string literal s1 = “Nome”; (s1 deixará de apontar para “Nome”, s2 agora é que apontará para “Nome”) s2 = “Nome”?
[/quote]

Não, conforme expliquei, tanto s1 quanto s2 apontam para “Nome”.

[quote=ViniGodoy][quote=Sleipbr]2 - Quando criado uma string literal o compilado verifica nesse local se existe alguma String literal igual, se sim, a string literal s1 = “Nome”; (s1 deixará de apontar para “Nome”, s2 agora é que apontará para “Nome”) s2 = “Nome”?
[/quote]

Não, conforme expliquei, tanto s1 quanto s2 apontam para “Nome”.[/quote]

hmm. agora saquei! Não será criado mais nenhuma String literal já que as duas são idênticas, as duas variáveis de referencia irão apontar para a mesma String literal.

Isso.

Isso gera a seguinte confusão, na prática:

[code]String s1 = “Nome”;
String s2 = “Nome”;
String s3 = new String(“Nome”);

if (s1 == s2)
System.out.println(“Igual”);
else
System.out.println(“Diferente”);

if (s1 == s3)
System.out.println(“Igual”);
else
System.out.println(“Diferente”);

if (s1.equals(s2))
System.out.println(“Igual”);
else
System.out.println(“Diferente”);

if (s1.equals(s3))
System.out.println(“Igual”);
else
System.out.println(“Diferente”);
[/code]

Esse código imprime
Igual
Diferente
Igual
Igual

Afinal, as comparações com == comparam endereços de memória (isto é, se as Strings são exatamente o mesmo objeto) enquanto a comparação do equals compara o conteúdo.
A confusão está no fato de muita gente não entender pq == as vezes funciona para Strings… e as vezes não.

Obrigado…

É correto afirmar que os objetos strings criado pela String Literal se encontrará localizado na pilha de memória “chamado” String Literal Pool, e os objetos instanciados com o new ficará na famosa pilha de memória conhecida como Garbage Collector?

Garbage Collector não é uma pilha de memória. É um software que gerencia a memória heap.

Então, Strings literais ficam no String Literal Pool.
Strings não literais ficam no Heap.