Article image

CS

Claudio Silverira27/04/2026 11:37
Compartilhe

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'}]

Obtemos como resultado uma saída sem duplicidade de dados, como esperado.

Compartilhe
Comentários (0)