Dúvida interessante

E ai Galera!

Bom… sabemos que uma String é um objeto e deve ser comparada usando equals? ok?

Então expliquem para mim porque a linha 6 imprime true!


1.     String s1 = new String("Dennys");
2.     String s2 = new String("Dennys");
3.     String s3 = "Dennys";
4.
5.     System.out.println( s1 == s2 );
6.     System.out.println( s3 == "Dennys" );

O X da questão é qual a diferença entre declarar uma string assim:

String s1 = new String("Dennys");

e uma outra string assim:

String s3 = "Dennys";

Valeu…

Atn.
Dennys Fredericci

se eu naum me engano quando vc executa:

String s = new String("Dennys"); String s2 = new String("Dennys");

vc tem 2 objetos Strings alocados na memória.

agora quando vc faz

String s = "Dennys"; String s2 = "Dennys";

vc utiliza a mesma referência em memória.

como o renan disse, o lance é o seguinte, em Java, existe um pool de strings q a JVM mantém… bem, vejamos, strings são objetos usados pelo programa todo, e consomem memória afuzel… quando tu faz isso:

vc esta instanciando um novo objeto string e colocando ele no pool… para q, quando outra referencia de string receber o valor “portal java”, faça uma referencia pra esse mesmo objeto (isto é pra nao disperdiçar memória, ele usa o mesmo objeto pra instancias diferentes), ex:

[code]String s2 = "portal java";

System.out.println( s1 == s2 );[/code]

esse código imprime “true”… pq, quando eu digo pra ele atribuir “portal java” a referencia s2, ele procura no pool por uma string com esse valor, e atribuir… É POR ISSO Q STRINGS SÃO IMUTÁVEIS… imagina se agora, eu mudo o valor “portal java” de s2 para “eu amo o portal java”, … s1 passaria a referenciar o mesmo objeto??? Não, se isso acontecesse, seria um baita erro… bem, e se eu fizer isso aqui:

ele vai estar criando um OUTRO objeto string, e não vai usar o q esta no pool… pq? pq vc esta dizendo explicitamente q será uma string nova, usando o operador new…

há diferenças na prática? Eu diria q não… strings são imutáveis… :slight_smile:

Ae Matheus… sempre iluminando o nosso caminho heim! Vlw… essa eu nao sabia…

Isso q eu chamo de OO :smiley:

eu já chamo de Sun Certified Programer! heheh

soh completando, a string soh vai pro pool qndo ela eh criada com dessa forma:

minhaString = "portal java";

se vc fizer:

String s1 = "portal java";
String s2;
String s3 = "eu amo ";
s1 = s3 + s1;
s2 = s3 + s1;
System.out.println(s1 == s2);

vai retornar false…

e nunca se deve criar uma string desse jeito:

String s = new String("portal java");

pq dai como vc ta forcando a criar um novo objeto, vai estar gastando mais memoria…

alguém ilumina o meu!! :sad:

http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=13552