2015-02-18 4 views
-1

Что произошло бы, если Map.Entry был Map.Entry [], а не список в hashMap? Я просто хочу понять, почему bucket - это список, а не реализация массива в hashmap java.Почему Map.Entry не массив?

+1

массив должен быть изменен каждый раз вы добавляете к нему элемент. Списки намного более динамичны. – chancea

+0

было ли это только причиной, я хочу найти элемент из списка, чтобы идти каждый узел. – Brijesh

+5

Запрет официального документа, говорящего об этом дизайнерском решении где-то, ответы на этот вопрос будут полностью основан на мнениях – ControlAltDel

ответ

1

Ну, это было бы просто сложнее в обращении, например, для переориентации.

Если вы посмотрите на коды List классов, вы узнаете, что у базы большинство из них - это просто Array с методами, упрощающими обработку массива для разработчиков.

+1

Да, я согласен с реализацией списка, но Map.Entry имеет следующий указатель, который будет указывать на следующее местоположение в памяти, а не на непрерывный блок памяти. – Brijesh

+0

. Ну не все списки - это просто массивные оболочки. Например, связанный список – chancea

+0

@Brijesh. Следующий указатель не указывается на следующее место в памяти, оно указывает на предыдущую «запись», которая жила по заданному индексу в массиве поддержки в то время, когда вы создаете новую «запись» для этого индекса. – azurefrog

1

Это нижеуказанным разница поможет вам понять, почему не Map.Entry[]

Основное соображение SIZE (пункт № 2), но есть и другие причины

Списки (Связанный список в этом случае) предпочтительнее по сравнению с массивами, когда:

  1. Вам нужны вставки/удаления постоянной продолжительности список (например, в вычислениях в режиме реального времени, где прогнозируемость по времени составляет абсолютно )
  2. Вы не знаете, сколько предметов будет в списке. С массивами, вам, возможно, придется повторно объявить и скопировать память, если массив становится слишком большой
  3. вам не нужен произвольный доступ к любым элементам

Массивы являются более предпочтительными, когда:

  1. вам нужен индексированный/случайный доступ к элементам

  2. вы знаете количество элементов в массиве заранее, чтобы тх т можно выделить нужное количество памяти для массива

  3. Массивы имеют O (1) произвольный доступ, но действительно дорого к добавить материал на или удалить материал с.

More Reasons are here , Please Help yourself

2

Я думаю, что вы говорите о LinkedList в каждой записи ковшом.

Скажем, это массив, когда вы добавляете элемент в это ведро, вам нужно создать массив определенного размера, например, 10, здесь вы уже выделяете память на 10 записей (конечно, это не так много), но элементы в этом массиве добавляются на основе элементов, имеющих одинаковые hashcode(), но разные equals(). Что делать, если в этом ковше имеется всего 2 элемента, но мы зарезервировали место на 10, вы можете в конечном итоге иметь мало заполненные массивы.

Также вам нужно иметь дело с повторной калибровкой этих массивов ковша, пока вы добавляете элементы, имеющие тот же хэш-код. И когда вам нужно иметь дело с повторной калибровкой, вы обычно поддерживаете счетчик, чтобы проверить, достигает ли количество элементов текущего размера массива, создает больший массив, копирует все эти элементы, и вы должны все это в одном вызове put на карту :) Основным преимуществом массивов является случайный доступ, но когда вы пытаетесь выполнить get некоторый элемент из массива, он не знает, какой из них соответствует equals(), поэтому он будет проходить через все элементы этого массива, теряя преимущество массивов.

Но если вы используете LinkedList, вы просто добавляете элементы, не нужно создавать/изменять размер массива. Также, если вы заметили, одна умная вещь, которую они делают при добавлении элементов в LinkedList, - они не проходят через весь список, чтобы найти последний элемент. Они создают новый объект Entry, следующий элемент которого указывает на существующий элемент, хранящийся в индексе bucket, и обновляет индекс bucket, чтобы указать на этот новый элемент, поэтому им не нужно перемещаться по списку каждый раз, когда вы добавляете новый элемент. Так что это выигрыш в памяти и скорости :)

Еще одно обновление в jdk8 заключается в том, что эта реализация LinkedList изменена на Tree после достижения порога (8). Это облегчает быстрый поиск, поэтому вместо прохождения через все элементы до get некоторого элемента в O (n) (линейном) времени, теперь O (logn)

+0

Для лучшее понимание реализации HashMap, прочитайте [это] (http://javahungry.blogspot.com/2013/08/hashing-how-hash-map-works-in-java-or.html) – Arkantos

+1

Заметно, что жестко закодированные одноуровневые списки действительно эффективны для очень маленьких n, например, 0, 1 или 2 - это то, что вы ожидаете от хэш-таблиц. –

+0

Я согласен, что это редкие массивы и сохранение пространственного аргумента. – Khanna111

Смежные вопросы