Hashmap для junior-ів
Дан код: Якою буде результат компіляції і виконання програми?
Якщо в класі перевизначити метод hashCode таким чином, щоб він повертав випадкове значення і використовувати об'єкти цього класу в якості ключів в HashMap, то як буде вести себе колекція?
Якщо перевизначити метод hashCode так, щоб він постійно повертав одне і теж значення (return 4;) і використовувати об'єкти цього класу в якості ключів в HashMap, то як буде вести себе колекція?
Ці питання взяті з співбесід на посаду junior Java developer і для початківців часто бувають каменем спотикання. Тому поки свіжі враження поспішаю поділитися з вами :)
Потрібно просто знати 2 моменти роботи HashMap:
1) індекс осередки в хеш-таблиці, в яку буде кожіться пара ключ-значення визначається як функція від key.hashCode (). Тобто виходить шляхом маніпуляцій з HashCode-му ключа. Різні ключі можуть бути покладені в одну й ту ж саму комірку таблиці (це називається колізією), тоді в самій комірці вони будуть розташовуватися у вигляді зв'язного списку.
2) ключі в HashMap порівнюються за допомогою методу key.equals ().
Якщо в класі, який буде використовуватися в якості ключа перевизначити метод hashCode таким чином, щоб він кожен раз повертав випадкове число, то ми зможемо скласти в колекцію об'єкти, але не зможемо їх звідти діставати, тому що в більшості випадків, пошук буде відбуватися не в тій комірці HashMap в якій зберігається шукане значення.
Якщо ж перевизначити метод hasCode щоб він завжди повертав одне і те ж значення, то ми зможемо лодіть і діставати об'єкти в колекцію, але вони все будуть зберігатися в одній комірці і HashMap буде себе вести (в плані продуктивності) як зв'язний список.
Якщо Вам сподобався питання, проголосуйте за нього