Что произошло бы, если Map.Entry был Map.Entry [], а не список в hashMap? Я просто хочу понять, почему bucket - это список, а не реализация массива в hashmap java.Почему Map.Entry не массив?
ответ
Ну, это было бы просто сложнее в обращении, например, для переориентации.
Если вы посмотрите на коды List
классов, вы узнаете, что у базы большинство из них - это просто Array
с методами, упрощающими обработку массива для разработчиков.
Да, я согласен с реализацией списка, но Map.Entry имеет следующий указатель, который будет указывать на следующее местоположение в памяти, а не на непрерывный блок памяти. – Brijesh
. Ну не все списки - это просто массивные оболочки. Например, связанный список – chancea
@Brijesh. Следующий указатель не указывается на следующее место в памяти, оно указывает на предыдущую «запись», которая жила по заданному индексу в массиве поддержки в то время, когда вы создаете новую «запись» для этого индекса. – azurefrog
Это нижеуказанным разница поможет вам понять, почему не Map.Entry[]
Основное соображение SIZE (пункт № 2), но есть и другие причины
Списки (Связанный список в этом случае) предпочтительнее по сравнению с массивами, когда:
- Вам нужны вставки/удаления постоянной продолжительности список (например, в вычислениях в режиме реального времени, где прогнозируемость по времени составляет абсолютно )
- Вы не знаете, сколько предметов будет в списке. С массивами, вам, возможно, придется повторно объявить и скопировать память, если массив становится слишком большой
- вам не нужен произвольный доступ к любым элементам
Массивы являются более предпочтительными, когда:
вам нужен индексированный/случайный доступ к элементам
вы знаете количество элементов в массиве заранее, чтобы тх т можно выделить нужное количество памяти для массива
Массивы имеют O (1) произвольный доступ, но действительно дорого к добавить материал на или удалить материал с.
Я думаю, что вы говорите о LinkedList
в каждой записи ковшом.
Скажем, это массив, когда вы добавляете элемент в это ведро, вам нужно создать массив определенного размера, например, 10, здесь вы уже выделяете память на 10 записей (конечно, это не так много), но элементы в этом массиве добавляются на основе элементов, имеющих одинаковые hashcode()
, но разные equals()
. Что делать, если в этом ковше имеется всего 2 элемента, но мы зарезервировали место на 10, вы можете в конечном итоге иметь мало заполненные массивы.
Также вам нужно иметь дело с повторной калибровкой этих массивов ковша, пока вы добавляете элементы, имеющие тот же хэш-код. И когда вам нужно иметь дело с повторной калибровкой, вы обычно поддерживаете счетчик, чтобы проверить, достигает ли количество элементов текущего размера массива, создает больший массив, копирует все эти элементы, и вы должны все это в одном вызове put
на карту :) Основным преимуществом массивов является случайный доступ, но когда вы пытаетесь выполнить get
некоторый элемент из массива, он не знает, какой из них соответствует equals()
, поэтому он будет проходить через все элементы этого массива, теряя преимущество массивов.
Но если вы используете LinkedList
, вы просто добавляете элементы, не нужно создавать/изменять размер массива. Также, если вы заметили, одна умная вещь, которую они делают при добавлении элементов в LinkedList
, - они не проходят через весь список, чтобы найти последний элемент. Они создают новый объект Entry
, следующий элемент которого указывает на существующий элемент, хранящийся в индексе bucket, и обновляет индекс bucket, чтобы указать на этот новый элемент, поэтому им не нужно перемещаться по списку каждый раз, когда вы добавляете новый элемент. Так что это выигрыш в памяти и скорости :)
Еще одно обновление в jdk8 заключается в том, что эта реализация LinkedList
изменена на Tree
после достижения порога (8). Это облегчает быстрый поиск, поэтому вместо прохождения через все элементы до get
некоторого элемента в O (n) (линейном) времени, теперь O (logn)
Для лучшее понимание реализации HashMap, прочитайте [это] (http://javahungry.blogspot.com/2013/08/hashing-how-hash-map-works-in-java-or.html) – Arkantos
Заметно, что жестко закодированные одноуровневые списки действительно эффективны для очень маленьких n, например, 0, 1 или 2 - это то, что вы ожидаете от хэш-таблиц. –
Я согласен, что это редкие массивы и сохранение пространственного аргумента. – Khanna111
- 1. Почему параметр параметра Entry скрывает тип Map.Entry?
- 2. Java 8 Map.Entry компаратор
- 3. Как правильно использовать интерфейс Map.Entry и почему методы Map.Entry уже реализованы?
- 4. Java Instantiate new Map.Entry-array
- 5. Java Map.Entry и TreeSet
- 6. Map.Entry: Как его использовать?
- 7. Возврат Map.Entry в Java
- 8. Map.Entry следующий метод?
- 9. Java, использующий Map.Entry через карту, не компилирующую
- 10. Java расширения Map.Entry() без дженериков
- 11. Сортировка набор с Map.Entry значения
- 12. Map.Entry и entrySet() общий тип идет неправильно
- 13. Почему массив не определен?
- 14. Почему массив не формируется?
- 15. MyBatis Ошибка на Сборнике Map.Entry и Map.entrySet()
- 16. Почему этот «массив» не оценивается как массив?
- 17. Почему массив b не копирует весь массив?
- 18. Почему многомерный массив, а не 1d массив?
- 19. Java: реализованы методы Treemap на map.entry, возможно?
- 20. компаратор для Map.Entry <K,V>
- 21. Почему массив не печатает список?
- 22. Почему это не массив BASH?
- 23. Почему этот массив не печатает?
- 24. Почему это не печатает массив?
- 25. Почему массив PHP не добавляется?
- 26. Почему мой массив не обновляется?
- 27. Почему мой массив не изменяется?
- 28. Почему этот массив не загрязняется?
- 29. Почему мой массив не обратится?
- 30. Почему array_combine не возвращает массив?
массив должен быть изменен каждый раз вы добавляете к нему элемент. Списки намного более динамичны. – chancea
было ли это только причиной, я хочу найти элемент из списка, чтобы идти каждый узел. – Brijesh
Запрет официального документа, говорящего об этом дизайнерском решении где-то, ответы на этот вопрос будут полностью основан на мнениях – ControlAltDel