Когда java.util.Set проверяет наличие дубликатов

У меня есть очень простой вопрос, когда java.util.Установить проверки, являются ли добавляемые объекты дубликатами?

Поскольку у меня есть класс модели, как показано ниже, который переопределяет методы equals и hashcode.

public class SampleModel implements Comparable {
    private String name;

    public SampleModel(String name) {
        this.name = name;
    }

    // Setter and Getter omitted
    @Override
    public boolean equals(Object arg0) {
        boolean eq = false;

        if (arg0 instanceof SampleModel
                && this.name.equalsIgnoreCase(((SampleModel) arg0).name)) {
            eq = true;
        }
        return eq;
    }

    @Override
    public int compareTo(Object arg0) {
        return this.name.compareTo(((SampleModel) arg0).name);
    }

    @Override
    public int hashCode() {
        return this.name.length();
    }
}

Вот как я использую объекты модели в HashSet.

    SampleModel s1 = new SampleModel("Satya");
    SampleModel s2 = new SampleModel("Katti");

    Set<SampleModel> samSet = new HashSet<SampleModel>();
    System.out.println(samSet.add(s1));
    System.out.println(samSet.add(s2));

    s2.setName("Satya");
    System.out.println(s2.getName());
    System.out.println(s1 + ", " + s2);

В соответствии с условием равенства объекты одинаковы и равны, но HashSet будет содержать дубликаты.

Имеются ли какие-либо нарушения в отношении равенства или хэш-кода? Если этот код в порядке, то есть ли способы предотвратить добавление дубликатов?

Я предполагаю, какие поля, используемые при определении равенства и хэш-кода, должны быть сделаны неизменными?

11
задан Shashi 23 July 2013 в 12:38
поделиться