Неправильное поведение Kotlin HashSet (ошибка)

У меня странное поведение класса HashSet. Не знаю почему, но метод contains возвращает неверный результат. Вот изображение из отладчика:

Неправильное поведение Kotlin HashSet (ошибка)rootElemetns — это HashSet, который содержит некоторые FsEntries, представленные простым классом данных (без каких-либо дополнительных методов, только поля). Как Вы можете видеть fsEntry, переданный в метод contains, это тот же элемент, что и выделенный элемент (адрес @8939 тот же).

Почему contains возвращает false, но indexOf равно 5? Это неизвестная ошибка Kotlin? Заранее спасибо.

Версия плагина Kotlin: 1.3.40

P.S. С другими элементами в этом Set у меня правильный результат.

П.П.С. Как видите, если я конвертирую rootElements с помощью метода toArray(), он также возвращает правильный результат.

Изменяете ли вы объект после того, как вставили его в набор? Вы, вероятно, возитесь с хешем, который он сохранил.

Carcigenicate 27.06.2019 00:20

Можете ли вы создать минимальный воспроизводимый пример?

Marvin 27.06.2019 00:21

@Carcigenicate Хм, может там одно поле изменилось. Я проверю это завтра. Спасибо за идею.

don11995 27.06.2019 00:33

Если это так, то вы, вероятно, нарушаете требования набора. В Java вы не можете изменить ключи HashMap (которые поддерживаются HashSets). Вероятно, это похоже на Котлин. Когда вы вставляете объект, он хэширует его и помещает в слот в зависимости от хэша. Если вы затем измените объект, хэш изменится, и когда он хэширует объект во время проверки принадлежности, хэши будут другими, и поиск завершится ошибкой.

Carcigenicate 27.06.2019 00:41

Если вам нужно, чтобы вставленные объекты были изменяемыми, рассмотрите возможность использования HashMap вместо этого, связывая объект с некоторым ключом идентификатора и вместо этого выполняя поиск по идентификатору. Это нормально, если значения меняются.

Carcigenicate 27.06.2019 00:43
0
5
190
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо Carcigenicate, и я публикую данный ответ как правильный.

«Если это так, то вы, вероятно, нарушаете требования Set. В Java вы не можете изменить ключи HashMap (которыми поддерживаются HashSets). Скорее всего, это похоже на Kotlin. Когда вы вставляете объект, он хэширует его и помещает в слот в зависимости от хэша. Если вы затем измените объект, хеш изменится, и когда он хеширует объект во время проверки принадлежности, хэши будут другими, и поиск завершится ошибкой».

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