Declaração String [resolvido]

8 respostas
Sleipbr

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”); ?

8 Respostas

ViniGodoy

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”: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.

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.

ViniGodoy

Isso.

Isso gera a seguinte confusão, na prática:
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");

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.

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.

Criado 16 de junho de 2012
Ultima resposta 17 de jun. de 2012
Respostas 8
Participantes 2