dúvida entre == e equals

12 respostas
D
oi pessoal, com certeza  perguntaram e muito sobre o assunto,mas não encontrei solução para a seguinte dúvida dentro do assunto. tenho:

{

String st1, st2;

st1 = “olá mundo!”;

st2 = new String(“olá mundo!”);

}

a “String” não é classe?! então pq só dá true se eu usar “equals”?

12 Respostas

surfzera

String é a variavel não a classe.

thiago.correa

O == compara se dois objetos apontam para a mesma referência de memória
Enquanto o equals compara se semanticamente dois objetos possuem o mesmo valor

panthovillas

completando… use o == apenas para tipos primitivos (int, long, char, etc…)

rdgms

String é uma class sim…

surfzera

desculpe olhando para o = new String sim é um classe ! sorry

rimolive

== entre Strings só dá true se ambas estiverem sob o mesmo Classloader

D
Oi pessoal, obrigadopela a atenção, mas ainda não fiquei satisfeito.

se:

String st1, st2;

st1 = palavra;

st2 = palavra;

pq aki é retornado true com “==” , se são dois objetos diferentes apontando para conteúdo(mesmo sendo iguais) alocados em momentos diferentes?

rimolive

A JVM possui uma área de memória reservada para armazenar literais de Strings. Assim, quando uma variável recebe o conteúdo de uma String, ele verifica nessa área se já existe essa literal, e faz referência a ela.

Assim, se duas variáveis (dentro do mesmo Classloader) forem inicializadas com o mesmo conteúdo, elas podem ser comparadas com == e retornar true.

willricardo

Cara vou tentar explicar o que meu professor um dia me falou!!!

String é imutavel, portanto ele tem um pool que guarda as palavras e toda vez que instancia uma String ele vai neste pool e verifica se esta palavra já existe, se existir ele faz referencia a este objeto, portanto ele nunca ira criar dois objetos no pool. como foi seu exemplo “palavra”.

Portanto como são dois objetos diferentes mas fazendo referencia ao mesmo objeto no pool ira retornar true.

Algo deste tipo!!

Não sei se me entendeu!!

Obs: Confirme com o pessoal aqui, pois como lhe disse foi o que um professor me disse então vai saber neh!!

rsrs

ViniGodoy

Todas as strings criadas com aspas "", são armazenadas num local especial de memória.

Portanto:

String x = "Vinicius";
String y = "Vinicius";

vão apontar para o mesmo objeto, no mesmo local. É como se o Java fizesse isso:

String oculta = new String("Vinicius");
String x = oculta;
String y = oculta;

Como os dois apontam para o mesmo local da memória

x == y

Retorna true.

Agora, se você usar o new, você está forçando a criação de um novo objeto.
Portanto se:

String a = "Vinicius";
String b = new String("Vinicius");

a == b

retorna false.

O equals faz uma comparação com base no conteúdo, e não em endereços de memória. Ou seja, o código do equals deve se parecer com isso:

public boolean equals(String outra) { if (outra == null || outra.length != this.length) return false; for (int i = 0; i < this.length; i++) if (this.chatAt(i) != outra.charAt(i)) return false; return true; }

Portanto, em ambos os casos:

x.equals(y); // retorna true

E

a.equals(b); //retorna true.
D

AAAAAAAAAAAAAAAAAAAAAaa vlw pessoal, muito obrigado, desse spool só para String eu não sabia(ou não prestei atenção na aula), cada um ajudou um pouco na explicação deixando a solução 100%.
obrigado a todos.

B

Fora o “portanto”, está certo.

Ser imutável não necessáriamente indica ter um pool para ele, isso é somente uma das otimizações que dá pra fazer ao trabalhar com tipo de dados imutáveis.

Edit:

Só um adendo:

O método intern do String coloca explicitamente uma string dentro do pool, se ela já não estiver.

Criado 3 de julho de 2009
Ultima resposta 6 de jul. de 2009
Respostas 12
Participantes 9