Почему у меня есть дубликаты данных в моем HashSet? - PullRequest
1 голос
/ 26 сентября 2019

Я пытаюсь манипулировать HashSet в Java.Я видел, что обычно в HashSet нет дубликатов?

Вот мой код

 public class A{
    private int elem;

    public A(int elem) {
        this.elem = elem;
    }   
}

И в другом классе

import java.util.HashSet;
import java.util.Iterator;

public class B{

    private String name;
    private HashSet<A> listeA;


    public static void main(String[] args){
        HashSet<A> a = new HashSet<A>();

        B s = new B("B",a);
        A l1 = new A(15);
        A l2 = new A(14);
        A l3 = new A(15);

        a.add(l1);
        a.add(l2);
        a.add(l3);

        s.displayHashset();

    }

Так что, если HashSet не допускает дублирование, почему у меня это после выполнениякод:

15 
15 
14

Я не понимаю, как вторая "15" может быть принята в моем HashSet ..

Спасибо за ответы.

Ответы [ 2 ]

5 голосов
/ 26 сентября 2019

Вы не перекрыли equals() и hashcode().HashSet проверяет, равен ли объект другому, на основе метода equals.Кроме того, чтобы не проводить много сравнений, он группирует объекты с одинаковым хеш-кодом.

Обратите внимание, что обычно необходимо переопределять метод hashCode всякий раз, когда этот метод переопределяется, чтобы поддерживать общий контракт дляметод hashCode, который утверждает, что равные объекты должны иметь одинаковые хеш-коды.

Сгенерированная версия equals и хеш-код:

public class A{
    private int elem;

    public A(int elem) {
        this.elem = elem;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        A a = (A) o;
        return elem == a.elem;
    }

    @Override
    public int hashCode() {
        return Objects.hash(elem);
    }
}
1 голос
/ 26 сентября 2019

HashSet использует методы hashCode() и equals() для определения дубликатов.Когда вы реализуете эти методы, вы сообщаете HashSet, что вы подразумеваете под дублирующими экземплярами вашего класса.реализации по умолчанию hashCode() и equals(), унаследованные от класса Object, рассматривают каждый экземпляр вашего класса как уникальный объект, поэтому HashSet допускает несколько экземпляров с одинаковыми значениями для его свойств

...