Почему 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.

Для поддержания порядка вставки они использовали дважды связанный список (использовались до и после), но это можно сделать, используя односвязный список. В то же время они должны достичь функциональности порядка доступа и в том, что им необходимо частое перемещение элемента до конца и которые требуют частого удаления для частого удаления, они использовали дважды связанный список.