следует использовать функциональный язык Imo. Деревья сложнее представлять и манипулировать на ОО-языках.
Вы получите его, позвонив по номеру
myMap.keySet().iterator();
. Вам даже не нужно знать, что он существует; это просто артефакт реализации. Насколько вам известно, они могли использовать летающих обезьян для перебора ключей; пока они повторяются в соответствии со спецификацией, не имеет значения, как они это делают.
Кстати, знаете ли вы, что HashMap
имеет частный класс под названием KeyIterator
(как и ConcurrentHashMap
, ConcurrentSkipListMap
, EnumMap
, IdentityHashMap
, TreeMap
и и )?
Есть ли разница в том, как вы перебираете ключи HashMap
?
Edit: В ответ на ваш комментарий имейте в виду, что если вы пытаетесь перебрать все пары ключ-значение в 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
и
определены в интерфейсе Map
, они будут работать для любой Map
, а не только LinkedHashMap
.
Это частный класс, поэтому вы не можете использовать его напрямую.
private class KeyIterator extends LinkedHashIterator<K> {
его экземпляр возвращается при использовании обычного итератора.
myMap.keySet().iterator()
Вы не должны использовать ничего, что определено как часть внутренней реализации LinkedHashMap (то есть в исходном коде, но не определено в API). Что произойдет, если в следующем выпуске изменится внутренняя реализация? Весь ваш код, использующий его, сломается.
Вы должны использовать код API и сделать что-то вроде
myMap.keySet().iterator()