Fácil Java
Implemente equals e hashCode para Ponto
Enunciado
Crie uma classe Ponto com coordenadas x e y (inteiros). Sobrescreva equals e hashCode para que dois pontos sejam iguais se tiverem as mesmas coordenadas. Teste a igualdade e o uso em um HashSet.
Requisitos
- A classe
Pontodeve ter os camposxey. equalsdeve comparar os valores dexey.hashCodedeve ser consistente comequals.- O programa deve imprimir se dois pontos iguais são considerados iguais e o tamanho de um
HashSetcontendo ambos.
Código inicial
import java.util.*;
class Ponto {
private int x, y;
Ponto(int x, int y) {
this.x = x;
this.y = y;
}
// TODO: sobrescreva equals e hashCode
}
public class Main {
public static void main(String[] args) {
Ponto p1 = new Ponto(1, 2);
Ponto p2 = new Ponto(1, 2);
System.out.println("Iguais? " + p1.equals(p2));
Set<Ponto> set = new HashSet<>();
set.add(p1);
set.add(p2);
System.out.println("Tamanho do set: " + set.size());
}
}
Saída esperada
Iguais? true
Tamanho do set: 1
Ver dica
Use Objects.equals para comparar campos e Objects.hash para gerar o hash.
Mostrar solução
import java.util.*;
class Ponto {
private int x, y;
Ponto(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Ponto ponto = (Ponto) o;
return x == ponto.x && y == ponto.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
public class Main {
public static void main(String[] args) {
Ponto p1 = new Ponto(1, 2);
Ponto p2 = new Ponto(1, 2);
System.out.println("Iguais? " + p1.equals(p2));
Set<Ponto> set = new HashSet<>();
set.add(p1);
set.add(p2);
System.out.println("Tamanho do set: " + set.size());
}
}
Passo a passo
- Definimos a classe
Pontocom dois campos inteirosxey. - No método
equals, primeiro verificamos se é a mesma referência (this == o). Se for, retornamostrueimediatamente. - Em seguida, verificamos se
oénullou se a classe é diferente. Se for, retornamosfalse. - Fazemos o cast para
Pontoe comparamos os valores dexeycom==. - No
hashCode, usamosObjects.hash(x, y)para gerar um código baseado nos mesmos campos usados emequals. - No
main, criamos dois pontos iguais e verificamosequalse o comportamento em umHashSet.
Por que funciona
O contrato de equals e hashCode é respeitado: dois objetos iguais têm o mesmo hash, então o HashSet os considera iguais e armazena apenas um. Isso ocorre porque o HashSet usa hashCode para encontrar o balde e equals para confirmar a igualdade.
Erros comuns
- Esquecer de sobrescrever
hashCode: se apenasequalsfor sobrescrito, oHashSetpode conter duplicatas porque os hashes serão diferentes. Exemplo:set.add(p1); set.add(p2);resultaria em tamanho 2. - Usar
==para comparar objetos:p1 == p2compara referências, não valores. Useequals. - Não tratar
null:o.equals(null)deve retornarfalse, mas se você não verificar, pode lançarNullPointerException.
Outra forma de resolver
Usar record (Java 16+), que gera automaticamente equals e hashCode:
record Ponto(int x, int y) {}
Isso é preferível quando a classe é imutável e serve apenas como portadora de dados.
Saída esperada
Iguais? true
Tamanho do set: 1