Почему linkedhashmap поддерживает двусвязный список для итерации
Поскольку в любом потоке нет внутреннего и разумного объяснения.
Пожалуйста, дайте мне точную причину.
-
для порядка вставки достаточно, чтобы поддерживать с одиночным списком, но почему?
-
как двусвязный список увеличивает производительность в этом сценарии?
-
все методы наследуются из методов хэш-формы хэш-4, тогда итератор для hashmap не поддерживает порядок, тогда как связаннаяhashmap поддерживает порядок?
Ответы
Ответ 1
Вы правы, что вам нужно поддерживать только связанный список, чтобы отслеживать порядок вставки. Но для того, чтобы эффективно поддерживать отдельный список, вам действительно нужен двойной список.
Рассмотрим три записи в порядке
A ---> B ---> C
Предположим, вы удалите B
. Очевидно, A
теперь должен указывать на C
. Но если вы не знаете запись до B
, вы не можете эффективно сказать, какая запись должна теперь указывать на C
. Чтобы исправить это, вам нужны записи для указания в обоих направлениях.
---> --->
A B C
<--- <---
Таким образом, при удалении B
вы можете просто просмотреть записи до и после B
(A
и C
) и обновить, чтобы A
и C
указывали друг на друга.
Причина LinkedHashMap
поддерживает порядок вставки, а HashMap
не работает, несмотря на то, что все, кроме 4 метода наследуются, заключается в том, что он очень умно написан. Большинство операций, связанных с реализацией, являются членами HashMap.Entry
, а не HashMap
. LinkedHashMap
имеет класс private static
LinkedHashMap.Entry
, который расширяет класс static
HashMap.Entry
от HashMap
. Если вы вызываете put
или remove
, например, код для LinkedHashMap
может быть таким же, как и код для HashMap
, потому что это сами записи, которые отслеживают до и после информации. В качестве примера здесь приведен полный код для LinkedHashMap.Entry.remove()
, который я объяснял выше
private void remove() {
before.after = after;
after.before = before;
}
Ответ 2
LinkedHashMap в основном поддерживает два указателя для каждой записи, а именно:
До, После
поскольку название предполагает, что указатели используются для целей упорядочения и используются для настройки указателей при вставках или удалениях.
Ответ 3
Чтобы поддерживать Порядок вставки, есть ссылка LinkedList. В любой момент времени вы можете двигаться вперед node или назад Node. Но если у вас есть единственный LinkedList, если ваш указатель перемещен в последний элемент, вам снова нужно начинать с начальной точки, и вы не можете перемещаться по предыдущему Node.
Ответ 4
LinkedHashMap может использоваться для поддержания порядка вставки и для поддержания порядка доступа.
LinkedHashMap унаследовал ту же функциональность hashmap для ведения списка в ведре, поэтому использовал ссылку next.
Для поддержания порядка вставки они использовали дважды связанный список (использовались до и после), но это можно сделать, используя односвязный список. В то же время они должны достичь функциональности порядка доступа и в том, что им необходимо частое перемещение элемента до конца и которые требуют частого удаления для частого удаления, они использовали дважды связанный список.