Sobes.tech
Junior

O que faz o método equals() em Java?

sobes.tech IA

Resposta da IA

O método equals() em Java é usado para comparar o conteúdo de dois objetos. Por padrão, na classe Object, ele compara referências de objetos, ou seja, verifica se duas variáveis apontam para o mesmo objeto na memória.

No entanto, a maioria das classes em Java (por exemplo, String, Integer) redefine esse método para comparar os valores contidos nos objetos, e não suas referências.

Ao redefinir equals(), é importante seguir seu contrato:

  • Reflexividade: x.equals(x) deve ser true para qualquer x não nulo.
  • Simetria: x.equals(y) deve ser true se e somente se y.equals(x) for true para quaisquer x e y não nulos.
  • Transitividade: Se x.equals(y) e y.equals(z) são true, então x.equals(z) também deve ser true para quaisquer x, y e z não nulos.
  • Consistência: Múltiplas chamadas a x.equals(y) devem retornar o mesmo resultado, desde que os objetos não tenham sido alterados.
  • Para qualquer x não nulo, x.equals(null) deve ser false.

Exemplo de redefinição de equals():

class MyObject {
    private int value;

    public MyObject(int value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        MyObject myObject = (MyObject) obj;
        return value == myObject.value;
    }
}

Uso de equals():

// Comparação por referência (por padrão em Object)
Object obj1 = new Object();
Object obj2 = new Object();
boolean porReferencia = obj1.equals(obj2); // false

// Comparação por valor (em `equals` redefinido)
MyObject myObj1 = new MyObject(10);
MyObject myObj2 = new MyObject(10);
boolean porValor = myObj1.equals(myObj2); // true

Também é importante redefinir o método hashCode() ao redefinir equals(), para manter seu contrato e evitar problemas com coleções que usam hashing (por exemplo, HashMap, HashSet).