Перш за все, це повністю залежить від того, який тип карти ви використовуєте. Але оскільки потік JavaRanch говорить про HashMap, я припускаю, що це реалізація, про яку ви говорите. Припустимо також, що ви говорите про стандартну реалізацію API від Sun / Oracle.
По-друге, якщо вас турбує продуктивність при перегляді вашої хеш-карти, я пропоную вам поглянути LinkedHashMap
. З документів:
Для ітерації подань колекції LinkedHashMap потрібен час, пропорційний розміру карти, незалежно від її місткості. Ітерація через HashMap, ймовірно, буде дорожчою, вимагаючи часу, пропорційного її потужності.
HashMap.entrySet ()
Вихідний код для цієї реалізації доступний. Реалізація в основному просто повертає нове HashMap.EntrySet
. Клас, який виглядає так:
private final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
public Iterator<Map.Entry<K,V>> iterator() {
return newEntryIterator();
}
}
і HashIterator
виглядає як
private abstract class HashIterator<E> implements Iterator<E> {
Entry<K,V> next;
int expectedModCount;
int index;
Entry<K,V> current;
HashIterator() {
expectedModCount = modCount;
if (size > 0) {
Entry[] t = table;
while (index < t.length && (next = t[index++]) == null)
;
}
}
final Entry<K,V> nextEntry() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
Entry<K,V> e = next;
if (e == null)
throw new NoSuchElementException();
if ((next = e.next) == null) {
Entry[] t = table;
while (index < t.length && (next = t[index++]) == null)
;
}
current = e;
return e;
}
}
Отже, у вас все ... Це код, який диктує, що станеться, коли ви повторите вхід через SetSet. Він проходить по всьому масиву, стільки ж, скільки ємність карт.
HashMap.keySet () та .get ()
Тут спочатку потрібно взяти набір ключів. Це вимагає часу, пропорційного місткості карти (на відміну від розміру для LinkedHashMap). Після цього ви телефонуєте get()
один раз для кожної клавіші. Звичайно, у середньому випадку при хорошій реалізації hashCode це вимагає постійного часу. Однак це неминуче вимагатиме багато .hashCode
та .equals
дзвінків, що, очевидно, займе більше часу, ніж просто entry.value()
дзвінок.