Получить LinkedList записей из LinkedHashMap с помощью метода values ​​() - PullRequest
8 голосов
/ 10 апреля 2019

Я пытаюсь понять, могу ли я получить связанный список записей из моей связанной хэш-карты. Я могу получить entrySet(), а затем с помощью итератора я получаю каждую запись в порядке вставки. Это даст мне связанный список записей в порядке вставки.

Могу ли я гарантировать тот же результат, если я использую метод values()?

Ответы [ 3 ]

4 голосов
/ 10 апреля 2019

Начиная с Java 8, давайте посмотрим на источник LinkedHashMap.Мы можем вычесть внутреннее поведение из определений методов entrySet() и values():

  • Метод entrySet() возвращает new LinkedEntrySet() встрока 627, которая использует new LinkedEntryIterator() в качестве итератора, начиная со строки 634.
  • Метод values() возвращает new LinkedValues() в строке 581, которая использует new LinkedValueIterator() в качестве итератора, начиная со строки 588.

Теперь давайте посмотрим на источники этих внутренних классов, определенных в том же файле, начиная со строки 737:

final class LinkedValueIterator extends LinkedHashIterator
    implements Iterator<V> {
    public final V next() { return nextNode().value; }
}

final class LinkedEntryIterator extends LinkedHashIterator
    implements Iterator<Map.Entry<K,V>> {
    public final Map.Entry<K,V> next() { return nextNode(); }
}

Они оба расширяют LinkedHashIterator, что подразумевает доступ к значениямкарта будет обрабатываться одинаково с использованием entrySet() и values().

1 голос
/ 10 апреля 2019

Могу ли я гарантировать тот же результат, если я использую метод values()?

По сути, LinkedHashMap#values возвращает вам ограниченное представление о внутренней структуре. И я рискну сказать, что должен дать тот же результат. Это явно не указано в документации

Возвращает Set представление отображений, содержащихся на этой карте. Набор поддерживается картой, поэтому изменения карты отражаются в наборе, и наоборот .

но выделенный фрагмент заставляет меня так думать.

«Тот же результат» - это больше, чем сбор данных: он включает способ итерации данных (итератор). «изменения в карте отражаются в наборе» для меня подразумевает, что оба итератора используют один алгоритм, который при одинаковом фрагменте данных приведет к одинаковому поведению.

0 голосов
/ 10 апреля 2019

Я так думаю. Внутренне класс использует java.util.LinkedHashMap.LinkedHashIterator, который используется как entrySet(), так и values(), поэтому, если первый позволяет вам выполнять итерации в порядке вставки, последний будет делать то же самое.

...