Arraylist не может сравнивать объекты после их загрузки с диска - PullRequest
3 голосов
/ 26 апреля 2010

Для простоты, скажем, у меня есть arraylist allBooks, содержащий класс "книги" и arraylist someBooks, содержащий некоторые, но не все "книги".

Использование метода contains () работало нормально, когда я хотел узнать, содержится ли книга одного массива в другом.

Проблема заключалась в том, что это больше не работает, когда я сохраняю оба Arraylists в файл .bin и загружаю их обратно после перезапуска программы. При выполнении того же теста, что и раньше, функция contains () возвращает false, даже если сравниваемые объекты одинаковы (имеют одинаковую информацию внутри).

Я решил, перегрузив метод equals, и он отлично работает, но я хочу знать, почему это произошло?

Ответы [ 4 ]

6 голосов
/ 26 апреля 2010

Вы должны будете предоставить свой собственный хеш-код и равную реализацию. По умолчанию он просто использует равенство указателей, которое, очевидно, не выполняется после «клонирования» объектов (цикл сериализации / десериализации).

2 голосов
/ 26 апреля 2010

Это звучит как общая проблема ссылочного равенства против Equals, и особенно часто встречается при сериализации.Отмените EqualsGetHashCode) соответствующим образом, и вы должны вернуться в бизнес.

Для информации, использование ArrayList следует обычно , если вы не используете .NET 1.1 (или микро-фреймворк), или есть очень веская причина для этого;предпочитаю универсальные типизированные коллекции, такие как List<T>.

2 голосов
/ 26 апреля 2010

Случилось так, что когда вы изначально создавали списки, они оба содержали ссылки на одни и те же объекты, но когда вы загружали их обратно, они оба получали отдельные копии одних и тех же объектов. Поскольку каждый список получил отдельные копии, они не содержали одинаковые ссылки, то есть они не сравнивались как равные без перегрузки правильного метода.

1 голос
/ 26 апреля 2010

Предполагая, что book является объектом, по умолчанию Equals проверяет, равна ли ссылка. Этого не может быть, когда вы загружаете новые объекты. Перезапись метода Equals является правильным подходом.
Другие варианты - изменить Book на структуру или использовать более современный контейнер, например, словарь или хеш-таблицу, где вы можете хранить книги по идентификатору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...