krembrule2016
@krembrule2016

Переопределил equals() и hashCode(), но почему в коллекцию все равно попадают одинаковые элементы?

Привет!
Написал такой класс. Все элементарно.
public class CustomBox {
    private int x;
    private int z;
    public CustomBox(int x, int z){
        this.x = x;
        this.z = z;
    }
    public int getX(){return x;}
    public int getZ(){return z;}
    @Override
    public boolean equals(Object obj)
    {
        if(this.x == ((CustomBox)obj).getX() && this.x == ((CustomBox)obj).getZ())
        {
            return true;
        }
        if (obj == null || obj.getClass() != this.getClass())
        {
            return false;
        }
        return false;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        return prime + prime * this.x + prime * prime * this.z;
    }
}

Но почему-то в коллекцию HashSet все равно попадают объекты с одинаковыми значениями полей. Что делать?
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
Во-первых, проверка на соответствие классов должна быть в начале метода equals, иначе возможно исключение. А во-вторых вы два раза сравниваете x: сначала с x, а затем с z
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
ОМФГ. Вообще так не делай.
Вариант 1) Написал класс с полями и заставил IDE сгенерировать всё остальное. Не будет глупых ошибок.
Вариант 2) Взял AutoValue и всё генерируется при компиляции.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы