HashMap - Entry vs Iterator

0

Kiedy użyć entry a kiedy iteratowa?

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    // ...
}
 
public static void printMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        System.out.println(pairs.getKey() + " = " + pairs.getValue());
        it.remove(); // avoids a ConcurrentModificationException
    } 
0

Zalezy od implementacji zbioru. Iterator wykorzystuje się wtedy gdy elementy kolekcji się porozrzucane po pamięci jak np w LinkedList. A dlaczego? Przy takim sposobie implementacji jeden element ma WSKAZNIK na miejsce w pamieci drugiego elementu. Jak bys w petli pobieral getem (get(i)) to za kazdym razem bys zaczynał od 0:
0
0 1
0 1 2
0 1 2 3 itd...
Iterator ma za zadanie pamiętać adres aktualnego elementu.
Nie musisz używać iteratorow jeżeli struktura jest zwarta, np. ArrayList bo tam tak na prawde siedzi zwykla(spojna) tablica pod spodem i odwolanie get(i) skacze pod odpowiedni adres bo ma pewnosc, ze dane z tablicy zajmuja odpowiedna spojna przestrzen w pamieci.

Edit, tak na prawde

Map.Entry<String, Object> entry : map.entrySet()

jest iteratorem

entrySet zwraca widok kolekcji po ktorym mozna iterowac

0

for (Map.Entry<String, Object> entry : map.entrySet()) tego typu pętla jest tzw. syntactic sugar (https://pl.wikipedia.org/wiki/Lukier_sk%C5%82adniowy). W rzeczywistości "pod spodem" używa iteratora -> https://docs.oracle.com/javase/8/docs/technotes/guides/language/foreach.html
Wniosek z tego taki, że nie musisz używać iteratora, wystarczy taki for.

Post kolegi wyżej odnosi się do czegoś innego - wspomina on o złożoności uzyskania kolejnych elementów w przypadku, kiedy iteruje się po liście tradycyjną pętlą for i wyciąga wartości kolejnych jej elementów, np.

for (int i =0; i < list.size(); i++) {
String a = list.get(i);
//zrób coś z a...
} 
0

A co w przypadku usuwania elementów w trakcie iterowania?
Jak usunąc element w pętli bezpiecznie

0

zobacz użyj google i znajdziesz coś takiego: http://stackoverflow.com/a/6092681

1 użytkowników online, w tym zalogowanych: 0, gości: 1