Итерация по хэш-карте: цикл For с использованием произвольного доступа ИЛИ итератор? - PullRequest
3 голосов
/ 11 марта 2011

Мне нужно перебрать Hashmap для получения значений, хранящихся в нем.

В качестве бонуса у меня также есть список ключей. Так что у меня есть возможность перебирать его, используя итератор или произвольный доступ в цикле for. Какой из двух вариантов обеспечит более эффективный способ сделать это?

Ответы [ 4 ]

3 голосов
/ 11 марта 2011

Реальной разницы нет, но если вы получаете список ключей, вызывая map.keySet(), тогда проще всего перебрать entrySet():

for (Map.Entry<K, V> entry : map.entrySet()) {
     ...
 }

Таким образом, вы можете избежать необходимости создавать набор ключей и , а затем искать значение для каждого.

2 голосов
/ 11 марта 2011

Интуитивно я бы сказал, используйте итератор, поскольку он может не требовать каких-либо поисков и просто даст вам прямую производительность O (n).обратите внимание, что ваша лучшая производительность для случая будет O (n), так как вы касаетесь каждого элемента набора, а ваша средняя производительность для случая будет в O (n) раз больше, чем для вашего метода доступа.Поскольку Hash-поиск имеет высокую вероятность O (1), вы, скорее всего, будете все еще O (n), но с итератором, так как вы только вычисляете следующую позицию, вам (я думаю) гарантирован O (1) доступдля следующего элемента.Вот почему я бы выбрал итератор.Плюс постоянное время для вычисления следующего элемента, вероятно, лучше, чем постоянное время для поиска позиции по хешу.

2 голосов
/ 11 марта 2011
for (Object O : TheMap.values()) {
    // Do something
}
0 голосов
/ 11 марта 2011

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

...