Как получить keyIterator для LinkedHashMap? - PullRequest
13 голосов
/ 11 июня 2009

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

Ответы [ 3 ]

44 голосов
/ 11 июня 2009

Вы получите по телефону

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.

3 голосов
/ 11 июня 2009

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

  private class KeyIterator extends LinkedHashIterator<K> {

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

myMap.keySet().iterator()
3 голосов
/ 11 июня 2009

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

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

myMap.keySet().iterator()
...