Entendendo Set<>
- #Java
Interface Set<>
- É uma interface de coleção que representa um conjunto de elementos sem duplicatas, ao contrário de List.
- Não garante a ordem (depende da implementação: HashSet, LinkedHashSet, TreeSet)
- Não possui índice
- Baseada na lógica de conjunto matemático
Regra importante sobre duplicados
- Não permite dados duplicados de acordo com equals() e hashCode().
- Tipos do Java (Integer, String, etc.) já implementam corretamente esses métodos.
Clases próprias
- Se usar classes próprias (DTO, Entity, etc.), deve sobrescrever:
- o equals()
- o hashCode()
- Caso contrário, o Set considerará objetos iguais como diferentes.
O IntelliJ IDEA possui um recurso muito interessante. Na sua classe:
- Você pode gerá-los automaticamente:
- Clique com o botão direito → Generate → equals() and hashCode()
Exemplo para entender o que foi exposto acima considerando uma classe propia "User":
Considere a siguinte classe.
public class User {
private int code;
private String name;
public User(int code, String name) {
this.name = name;
this.code = code;
}
@Override
public String toString() {
return "User{" +
"code=" + code +
", name='" + name + '\'' +
'}';
}
}
Temos o método toString() para exibir uma saída no console.log
Considere a seguinte classe main, onde definimos um Set<> do tipo User e criamos as diferentes instâncias de User dentro do metodo add da variável Set recém definida.
public class Main {
public static void main() {
Set<User> setUser = new HashSet<>();
setUser.add(new User(1, "claudio"));
setUser.add(new User(2, "maria"));
setUser.add(new User(2, "maria"));
System.out.println(setUser);
}
}
(Estamos duplicando uma instância e o Java aceita isso)
O resultado será, segundo o nosso metodo toString() na classe "User":
[User{code=2, name='maria'}, User{code=1, name='claudio'}, User{code=2, name='maria'}]
Isso ocorre porque NÃO ESTAMOS implementando na nossa classe os métodos equals() e hashCode(), então o Java para cada new User(...) considera:
- É um objeto diferente na memória
- Possui hashCode diferente por padrão
- equals() compara por referência (não por conteúdo)
👉 Resultado: o Set considera que são diferentes e saidas duplicadas.
Solução esperada
- Definir os métodos equals() e hashCode() na classe User
- Podemos usar a ferramenta de geração automática do IntelliJ IDEA
clique com o botão direito → Generate → equals() and hashCode()
- E o código dos métodos será gerado automaticamente
public class User {
private int code;
private String name;
public User(int code, String name) {
this.name = name;
this.code = code;
}
@Override
public String toString() {
return "User{" +
"code=" + code +
", name='" + name + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return code == user.code && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(code, name);
}
}
Se executarmos nosso "main" agora, a saída agora será:
[User{code=2, name='maria'}, User{code=1, name='claudio'}]



