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.
Sleipbr
Eu li alguma coisa sobre isso que diz:
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” é 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.
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”?
ViniGodoy
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”?
Não, conforme expliquei, tanto s1 quanto s2 apontam para “Nome”.
Sleipbr
ViniGodoy:
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”?
Não, conforme expliquei, tanto s1 quanto s2 apontam para “Nome”.
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.
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.
Sleipbr
Obrigado…
Sleipbr
É 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?
ViniGodoy
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.