Dies hängt zunächst ganz davon ab, welchen Kartentyp Sie verwenden. Da der JavaRanch-Thread jedoch über HashMap spricht, gehe ich davon aus, dass dies die Implementierung ist, auf die Sie sich beziehen. Nehmen wir auch an, Sie sprechen von der Standard-API-Implementierung von Sun / Oracle.
Zweitens, wenn Sie sich Sorgen über die Leistung beim Durchlaufen Ihrer Hash-Map machen, sollten Sie sich diese ansehen LinkedHashMap
. Aus den Dokumenten:
Das Durchlaufen der Sammlungsansichten einer LinkedHashMap erfordert unabhängig von ihrer Kapazität Zeit, die proportional zur Größe der Karte ist. Die Iteration über eine HashMap ist wahrscheinlich teurer und erfordert Zeit proportional zu ihrer Kapazität.
HashMap.entrySet ()
Der Quellcode für diese Implementierung ist verfügbar. Die Implementierung gibt im Grunde nur eine neue zurück HashMap.EntrySet
. Eine Klasse, die so aussieht:
private final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
public Iterator<Map.Entry<K,V>> iterator() {
return newEntryIterator();
}
}
und HashIterator
sieht aus wie
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;
}
}
Da haben Sie es also ... Das ist der Code, der vorschreibt, was passieren wird, wenn Sie ein entrySet durchlaufen. Es geht durch das gesamte Array, das so lang ist wie die Kartenkapazität.
HashMap.keySet () und .get ()
Hier müssen Sie zuerst den Schlüsselsatz beschaffen. Dies benötigt Zeit proportional zur Kapazität der Karte (im Gegensatz zur Größe für die LinkedHashMap). Danach rufen Sie get()
für jede Taste einmal auf. Sicher, im Durchschnitt dauert dies bei einer guten HashCode-Implementierung eine konstante Zeit. Allerdings wird es zwangsläufig viele erfordern .hashCode
und .equals
Anrufe, die offensichtlich mehr Zeit in Anspruch nehmen als nur einen tun entry.value()
Anruf.