o metodo equals faz comparação com o “endereço” do objeto certo, certo ?
Mas quando se tem um objeto String oque define o endereço é o conteúdo que o objeto String tem, por tanto oque acaba confundindo quando se tem duas Strings (dois objetos diferentes), elas tem o mesmo conteúdo mas “sim” são objetos diferentes, eu acho isso sacanagem bem trool, se você não for afundo no assunto acaba apanhando . Oque vocês acham sobre isso ?
Posso ter entendido errado, mas cai no caso entre igual and equivalência, podem soar parecidos, mas são bem diferentes. Exemplo seria o = que é diferente do ==.
Acho que é obrigação do desenvolvedor ir a fundo no assunto, independente de qual seja ele.
Afinal, um dos grandes problemas que temos é a superficialidade com a qual se deseja trabalhar. Isso causa código ruim e projetos péssimos.
Porém, no caso do equals, não é bem assim.
Já tentou usar os recursos da tua IDE e sobrescrever o método equals? Você verá que uma série de coisas são comparadas, dentre as quais podemos citar:
- Classe da qual a instância provém (se não forem objetos da mesma classe, são objetos distintos)
- hash code (se possuem hash codes diferentes, são objetos distintos)
Além da validação de nulidade do objeto em si e dos seus atributos (que podem, também, ser objetos).
mas e quando se compara Strings, oque é levado em conta ?
Da uma olhada aqui…
“… todos objetos do Java possuem um outro método chamado equals que é utilizado para comparar objetos daquele tipo. Por padrão, esse método apenas compara as referências dos objetos…”
vê se ajuda!
Abraço!
Exemplo:
String nome = "Astolpho Pamphilo";
Esta é uma instância de objeto, é uma String e está numa posição de memória X.
Agora, se você comparar com
"Astolpho Pamphilo".equals(nome)
Você tem uma nova instância de objeto da classe String, em uma posição de memória Y e que, pelo conteúdo, obviamente, terá o mesmo hash code, resultando em true como resultado.
A implementação padrão do equals compara a referência do objeto, sim.
Entretanto as subclasses de Object
sobrescrevem o método equals
(e o método hashcode
) caso queiram que a comparação seja baseada em seu conteúdo. Como acontece por exemplo com a classe String
e com classes wrapper.
A via de regra é a seguinte:
Quer comparar a referência: usa o ==
Quer comparar conteúdo: usa o equals
Aqui tenho alguns exemplos e explicações:
então como eu resolvo o problema de ter duas Strings(dois objetos distintos), e quero saber se são objetos diferentes ou não, oque devo fazer ?
tipo:
String nome = “nome”;
String nome2 = “nome”;
nome.equals(nome2);
este código retorna “true”(são iguais) sendo que são objetos diferente.O modo de resolver isso seria reescrevendo o método ?
Para testar se a referência é diferente, você utilizaria o ==
mas no seu exemplo o ==
também vai retornar true
.
Isso acontece pois a classe String
tem suas peculiaridades e tratamento diferenciado pelo compilador.
No seu exemplo, tanto a variável nome
, quanto a variável nome2
são o mesmo objeto.
Ou seja, ambas apontam para a mesma referência, que é a String "nome"
.
O compilador Java realiza algumas otimizações, uma delas é utilizar a mesma referência para literais do tipo String
.
então quer dizer, é impossível saber que são objetos diferentes quando se tem o mesmo conteúdo em ambas ?
Quando eu digo saber, quero dizer, fazer um verificação no código, e essa verificação me retornar que são objetos diferentes.
Não.
O == em Strings só retorna true para objetos diferentes se forem ambos inicializados diretamente com esse valor.
String a = "uma string";
String b = "uma string";
String c = "uma" + " string";
String d = new String("uma string");
String e1= "uma";
String e2 = " string";
String e = e1+e2;
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a==d);
System.out.println(a==e);
$
true
true
false
false
Não, conforme eu disse, o ==
compara a referência, isto é, se os dois objetos são o mesmo, se os dois identificadores referenciam o mesmo endereço de memória.
O equals
deve ser sobrescrito pelas classes que permitam comparar se o conteúdo é o mesmo.
O que talvez não ficou claro é que, no código fonte, o compilador Java utiliza somente uma referência para literais do tipo String
.
Então, se você faz isso:
String a = "texto";
String b = "texto";
O compilador vai dar uma otimizada e só vai haver um objeto String
com o conteúdo "texto"
, dessa forma, os identificadores a
e b
de fato são o mesmo objeto.
Se você quer dois objetos String
diferentes, mas com o mesmo conteúdo, faça:
String a = new String("texto");
String b = new String("texto");