Comparação entre objetos
Por que o o operador == não funciona em comparações de objetos?
Os objetos são criados por classes e por esse motivo não é possível a própria linguagem de programação identificar quais atributos uma classe vai ter e quais deveriam ser utilizados para que se tenha uma comparação entre dois objetos.
Quando criamos dois objetos o que temos é dois identificadores diferentes para cada objeto e quando se faz a comparação entre esses dois objetos utilizando o operador == o que teremos é uma comparação entre seus dois identificadores que são diferentes.
Por esse motivo utilizamos o método equal() mas vale resaltar que esse método já está implementado em algumas classes da própria linguagem como é o caso da String no Java, mas quando queremos comparar dois objetos de classes que nós mesmos implementamos nós precisamos sobrescrever esse método em nossas classes.
Pense em uma classe Casa e essa classe possui atributos que definem seu endereço (rua, bairro, cidade, uf, cep e número).
E temos dois objetos casa1 e casa2 criados por essa classe, sendo assim podemos querer comparar se todos os atributos são iguais pois poderiamos ter 2 casas onde todos os atributos são iguais menos o número nesse caso seriam casas diferentes, mas no caso de absolutamente todos os atributos fossem iguais então sim estariamos falando da mesma casa.
Exemplo de código onde se usa todos os atributos da classe para se fazer o equals:
public class Casa {
private String rua;
private String bairro;
private String cidade;
private String uf;
private String cep;
private int numero;
public String getRua() {
return rua;
}
public void setRua(String rua) {
this.rua = rua;
}
public String getBairro() {
return bairro;
}
public void setBairro(String bairro) {
this.bairro = bairro;
}
public String getCidade() {
return cidade;
}
public void setCidade(String cidade) {
this.cidade = cidade;
}
public String getUf() {
return uf;
}
public void setUf(String uf) {
this.uf = uf;
}
public String getCep() {
return cep;
}
public void setCep(String cep) {
this.cep = cep;
}
public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Casa casa = (Casa) o;
return numero == casa.numero && rua.equals(casa.rua) && bairro.equals(casa.bairro) && cidade.equals(casa.cidade) && uf.equals(casa.uf) && cep.equals(casa.cep);
}
}
No entanto muitas vezes acabamos comparando apenas um atributo, no caso de uma entidade recuperada do Banco de Dados apenas o atributo de ID pode identificar se dois objetos representam a mesma entidade nesse caso na sobreescrita do método equals() iremos comparar apenas o atributo id dos dois objetos.