Изучая исходный код 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()