jfranco, É mais ou menos por aí. Só não gostei muito da palavra “conteudo”… O que rola é que o método equals implementa uma avaliação de equivalência, que pode não ser simplesmente relacionada com “conteúdos iguais”. Por exemplo, suponha que tenhamos uma classe Cliente com a seguinte cara:
public class Cliente{
private String cpf;
private String nome;
private String sobrenome;
...
}
Vamos supor que essa classe vai ser utilizada para um programa de contas bancárias, onde para um cliente ser identificado de forma única, basta vermos o seu CPF. Nesse caso, teriamos que implementar o método equals() (que vem da classe Object) da seguinte forma:
public boolean equals(Object obj){
if(obj == null)
return false;
if(!(obj instanceof Cliente))
return false;
if(obj == this)
return true;
Cliente other = (Cliente)obj;
return this.cpf.equals(other.cpf);
}
Isso porque a Classe String tem lá a sua implementação do método equals();
Agora, vamos supor que nossa lógica de negócio fosse de tal forma que, só o CPF, não bastasse para identificar univocamente um Cliente (Por exemplo, uma criança sem CPF poderia ser cadastrada com o CPF do responsável). Então a implementação seria diferente:
public boolean equals(Object obj){
if(obj == null)
return false;
if(!(obj instanceof Cliente))
return false;
if(obj == this)
return true;
Cliente other = (Cliente)obj;
return
this.cpf.equals(other.cpf) &&
this.nome.equals(other.nome) &&
this.sobrenome.equals(other.sobrenome)
;
}
Quanto ao lance que vc mencionou no final, é verdade. Provavelmente o compilador deve perceber que as Strings (que estão declaradas no mesmo escopo) são equivalentes e, para economizar memória, faz as duas referências apontarem para um único endereço de memória que contém a String, acho que deve ser algo assim. Porém, é melhor sempre usar o equals mesmo, pra criar o hábito… :thumbup: