Почему хеш-таблица превращается в связанный список, когда реализация hashcode () возвращает постоянное значение?

// The worst possible legal hash function - never use!
@Override public int hashCode() { return 42; }

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

Я пытаюсь понять вышесказанное (цитата из стр. 47, пункт 9, Эффективная Java Джошуа Блоха).

Я вижу это следующим образом (рассмотрим следующий код):

Map<String, String> h = new HashMap<String,String>();
h.put("key1", "value1");
h.put("key1", "value2");

Что происходит со второй h.put ("key1", ...) командой: { {1}} 1. Получите хэш-код key1 2. Перейти к корзине, представляющей вышеуказанный хэш-код 3. В этом сегменте для каждого объекта вызовите метод equals, чтобы определить, существует ли идентичный объект.

Это отчасти быстрее, потому что сначала вы находите «группу» (ведро) объектов, а затем сам объект.

Теперь, когда реализация хэш-кода такова, что он возвращает одно и то же целое число (например, 42 выше) для ВСЕХ объектов, тогда существует только одна корзина, а метод equals необходимо вызывать по одному для каждого объекта во всей хэш-карте / хэш-таблице.Это так же плохо, как и связанный список, потому что, если объекты находятся в связанном списке, то также нужно будет проходить их один за другим, сравнивая (вызывая равные) каждый объект.

Не поэтому ли было сказано, что хэш-таблицы вырождаются в связанный список?

(Прошу прощения за многословность приведенного выше текста. Я недостаточно ясно понимаю свои концепции, чтобы иметь изложил это более кратко)

7
задан Ashutosh Jindal 15 October 2011 в 06:48
поделиться