Изучая исходный код LinkedHashMaps от Sun, я вижу, что есть закрытый класс KeyIterator, я бы хотел использовать его. Как я могу получить доступ?
Как получить ключевой элемент для LinkedHashMap?
Ответ 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()