Равно и хэш-код в arrayylist

Мой вопрос в том, почему ArrayList не удаляет дубликаты даже после того, как я реализую hashcode & equals в своем настраиваемом объекте.

Например: у меня есть объект сотрудника с идентификатором и именем в качестве атрибута, также я переопределяю хэш-код и равно, как показано ниже

@Override
public int hashCode() {
    return 1;
}

@Override
public boolean equals(Object obj) {

    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Employee other = (Employee) obj;

    if (this.id != other.id)
        return false;
    return true;
}

Где в документации ArrayList вы читали, что это коллекция, которая удаляет дубликаты? Вы путаете это с HashSet. Обратите внимание, что возвращать постоянное значение в hashCode - ужасная идея.

JB Nizet 23.09.2018 21:33

Ни один из стандартных списков не удаляет дубликаты. Вам нужно использовать HashSet.

Peter Lawrey 23.09.2018 21:33

Я полностью знаю, что в java docs не говорится, что списки предназначены для удаления дубликатов, но причина, по которой мы используем equals & hashcode, заключается в том, чтобы убедиться, что каждый объект идентифицируется как уникальный. Я также знаю набор, который удаляет дубликаты. Но я хотел понять значение equals & hashcode при использовании с arraylist. И нет необходимости голосовать против, если вы не полностью понимаете вопросы

vikas tiwari 24.09.2018 12:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
696
3

Ответы 3

Потому что List могут содержать повторяющиеся элементы. Если вы этого не хотите, вы можете использовать HashSet.

remove удаляет только первое вхождение (javadoc):

Removes the first occurrence of the specified element from this list, if it is present

Если вам вообще не нужны дубликаты - вы можете использовать Установленный.

Фактически, вы можете вызвать removeAll(Collections.singleton(element)), чтобы удалить все вхождения с написанием цикла.

Zephyr 23.09.2018 21:53

Списки не предназначены для уникальных значений. Это четко задокументировано в документации java.util.List:

Unlike sets, lists typically allow duplicate elements. More formally, lists typically allow pairs of elements e1 and e2 such that e1.equals(e2), and they typically allow multiple null elements if they allow null elements at all. It is not inconceivable that someone might wish to implement a list that prohibits duplicates, by throwing runtime exceptions when the user attempts to insert them, but we expect this usage to be rare.

Если вам нужен набор уникальных значений, используйте Set (вы, вероятно, захотите использовать HashSet)

Другие вопросы по теме