Um exercício de algoritmo e estrutura de dados 1

Observe os trechos de programa contidos abaixo, identificados como Trecho 1 e Trecho 2. Explique de maneira concisa e sem vícios de linguagem porque o compilador pode criar uma única instância de String no Trecho 2 e não pode fazer isso para o Trecho 1.

Trecho 1
int[] a={10,20,30};
int[] b={10,20,30};
System.out.println(a==b);
Trecho 1 imprime: false

Trecho 2
String x=?abc?;
String y=?abc?;
System.out.println(x==y);
Trecho 2 imprime: true

Qual seria uma resposta correta para essa questão??? Agradeço desde já a todos.

hum… supostamente o resultado dos dois trechos devia ser FALSE uma vez que se tratam de tipos de dados referênciados (array e objecto). Sendo tipos de dados referênciados, o operador relacional “==” torna-se inadequado para o caso pois o que este faz é verificar o ENDEREÇO(referência) e não o conteúdo. Portanto, ao fazeres isto:

int []a = {1,2,3}; int []b = {1,2,3};

Estás a criar dois arrays diferentes MAS com o mesmo conteúdo. O operador “==” não verifica o conteúdo.

No segundo trecho é a mesma coisa:

String a = "abc";
String b = "abc";

Isto são duas Strings diferentes mas com o mesmo conteúdo e por isso a operação “a==b” deveria originar false pois o conteúdo não é verificado mas sim a referência.

Agora, caso tenhas uma terceira String abc:


String abc = "string";
String x = abc; //repara que não tem aspas, ou seja, estou a igualar à String abc.
String y = abc;

O que acontece aqui é que a REFERÊNCIA da String abc é copiada para as Strings x e y, ou seja, as 3 Strings vão armazenar o mesmo endereço e assim estão todas a apontar para exactamente o mesmo conteúdo. Neste caso é legítimo que o trecho 2 imprima true, uma vez que se comparam as referências e estas são iguais.

Espero ter sido útil, apesar de não responder directamente à questão, a resposta está implicita.

PS: Da proxima vez que postares código usa formatação BB assim não ocorrem erros como tens no trecho 2 na declaração das Strings.

SrFabio, sua explicação foi excelente, entretanto faltou você testar o programa do trecho 2. Por incrível que pareça ele irá imprimir true, mesmo o tipo String sendo um tipo referência!!! Teste e veja você mesmo! Por este detalhe que o malvado professor cobrou na prova para que nós explicássemos tal fato!!!

Realmente o trecho de programa abaixo imprime true, (caso duvide, teste você mesmo) mas por que isso ocorre com String e com arranjo não? Eis a questão!!! Ajudem-me!!!

String a = "abc"; String b = "abc"; System.out.println(a==b);

Isso Acontece porque a String tem um comportamento diferente. Se tu não instanciar uma String com new, essa String é armazenada em um pool de Strings. Toda vez que uma nova String é declarada como String = “qualquer”, é verificado nesse pool se já existe uma igual. Se sim, então a variável é apontada para essa String já existente. Assim, quando for comparado com o sinal de ==, a resposta será true pois realmente está apontando para o mesmo endereço de memória.

Fernando

Muito bem Fernando, ora aí está uma coisa que eu não sabia :slight_smile: