Здравствуйте, sambl74, Вы писали:
PW>>Но ведь в бакете по идее hash должен быть одинаковый. S>Да, правильно.
PW>>Не врубаюсь, как это должно работать ((
S>А потом в бакете уже идёт поиск не по hash. S>Поэтому важно для объекта написать хорошую hash-функцию, чтобы в HashMap в один бакет не попадало много разных объектов.
И тогда она не будет хранить объекты в дереве, бедолага))) А как в доброй старой 7-й версии? в связанном списке.
Здравствуйте, PitoWilson, Вы писали:
vsb>>Исходный ключ.
PW>Правильно понимаю, что такая "древоизация" произойдет, только если исходный ключ реализует Comparable?
По сути да, сама процедура "древоизации" вроде произойдёт в любом случае, но без Comparable сформированное дерево выродится в связный список, по крайней мере по исходникам jdk8, насколько я вижу.
Здравствуйте, PitoWilson, Вы писали:
PW>Но ведь в бакете по идее hash должен быть одинаковый. PW>Не врубаюсь, как это должно работать ((
Нужно, чтобы ключ реализовал Comparable. Это появилось в JDK6, до этого объекты тупо хранились в массиве.
Такой метод нужен для защиты от DOS-атак, когда атакующий может контролировать ключ. Так как хэш-код в Java детерминирован, то можно подобрать такую последовательность ключей, что все значения окажутся внутри одной корзины в хэщ-карте.
Мы как-то потратили неделю на поиск ошибки из-за того, что один наш класс немного неправильно реализовал Comparable.
Sapienti sat!
Re[3]: HashMap хранит бакеты в форме дерева - вопрос
Здравствуйте, PitoWilson, Вы писали:
PW>Не врубаюсь, как это должно работать ((
Вкратце, HashMap хранит массив бакетов фиксированного размера. В методах get/put по хэш-коду ключа специальным образом вычисляется индекс в этом массиве. Бакет, элемент массива — либо пуст (null, т.е. по данному ключу ничего нет), либо единичная пара, либо список из пар "ключ"-"значение" (а также вычисленный хэш-код для ключа). Последний вариант означает, что у нас коллизии, и скорость работы HashMap падает с обычного O(1) ниже, вплоть до линейной O(n) в худшем варианте. Таким образом, в одном бакете при коллизиях могут лежать объекты с разными хэшами (если по ним получается одинаковый индекс). Ну и еще ключ null обрабатывается отдельно (для него хэшем всегда будет 0).
Вообще на собеседованиях почему-то любят этот вопрос про устройство хэш-таблицы. Очень глупо, это ничего не говорит о соискателе (ну, разве что он не полный мартыхан и умеет пользоваться Гуглом, может что-то скопипастить). Для проверки теории алгоритмов лучше спрашивать про TreeMap (и вообще обсудить сбалансированные деревья), для проверки же реальных профессиональных навыков лучше вопросы по многопоточности.
Как запру я тебя за железный замок, за дубовую дверь окованную,
Чтоб свету божьего ты не видела, мое имя честное не порочила…
М. Лермонтов. Песня про царя Ивана Васильевича, молодого опричника и удалого купца Калашникова