Как получить ключевой элемент для LinkedHashMap?

Изучая исходный код LinkedHashMaps от Sun, я вижу, что есть закрытый класс KeyIterator, я бы хотел использовать его. Как я могу получить доступ?

Ответ 1

Вы получите его, позвонив

myMap.keySet().iterator();

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

Кстати, знаете ли вы, что HashMap имеет частный класс под названием KeyIterator (как и ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, IdentityHashMap, TreeMap и WeakHashMap)?
Значит ли это, что вы перебираете ключи из HashMap?

Изменить: В ответ на ваш комментарий имейте в виду, что если вы пытаетесь выполнить итерацию всех пар ключ-значение в Map, есть лучший способ, чем итерация по клавишам и вызывая get для каждого. Метод entrySet() получает Set всех пар ключ-значение, которые затем можно перебрать. Поэтому вместо написания:

for (Key key : myMap.keySet()) {
    Value val = myMap.get(key);
    ...
}

вы должны написать:

for (Map.Entry<Key, Value> entry : myMap.entrySet()) {
    doSomethingWithKey(entry.getKey());
    doSomethingWithValue(entry.getValue());
    ...
}

Вы также можете перебирать значения values(), если хотите.

Обратите внимание, что поскольку keySet, entrySet и values определены в интерфейсе Map, они будут работать для любой Map, а не только LinkedHashMap.

Ответ 2

Вы не должны использовать ничего, что определено как часть внутренней реализации LinkedHashMap (то есть в исходном коде, но не определенном в API). Что произойдет, если внутренняя реализация изменится в следующей версии? Весь ваш код, используя его, сломается.

Вы должны ввести код API и сделать что-то вроде

myMap.keySet().iterator()

Ответ 3

Это частный класс, поэтому вы не можете напрямую его использовать.

  private class KeyIterator extends LinkedHashIterator<K> {

Экземпляр его возвращается, когда вы используете обычный Iterator.

myMap.keySet().iterator()