IteratorとForeachの選択方法

5689 ワード

Map<String, String> map = new HashMap<>();
map.put("01", "java");
map.put("03", "php");
map.put("05", "BigData");
map.put("02", "python");

System.out.println(map);

mapを巡るには、いろいろな方法があります
  • 遍歴方法一
  • //  Set keySet()  
    Set<String> set1 = map.keySet();
    //     
    Iterator<String> iterator = set1.iterator();
    while (iterator.hasNext()) {
        String key =  iterator.next();
    
        //    value
        System.out.println("key:"+key+"   value:"+map.get(key));
    }
  • 遍歴方法二
  • //Set.Entry> entrySet() 
    //     entry set
    Set.Entry> set = map.entrySet();
    //     
    Iterator.Entry> iterator2 = set.iterator();
    while (iterator2.hasNext()) {
        Map.Entry entry = iterator2.next();
        //entry.setValue("hah");
        //    key,value
        System.out.println("key:"+entry.getKey()+"   value:"+entry.getValue());
    }
    System.out.println(map);
  • 遍歴方法三
  • //  foreach  
    for (Entry entry : map.entrySet()) {
        System.out.println("key:"+entry.getKey()+"   value:"+entry.getValue());
    }

    foreachの使用が非常に便利で、効率が大幅に向上していることが明らかになりました.
    こんな簡単な方法がある以上,だれが反復器を使うのか,まったく欠点がある.
    しかし、物事は想像していたほど簡単ではありません.
    多くの調査研究を経て、foreachは1種の“文法糖”で、いわゆる文法糖はコンパイラあるいはその他の手段を通じてコードを最適化して、使用に遍歴をもたらしました.つまり、Javaが開発者に与える福祉です.では、foreachの使用条件は何ですか.
    要件:配列またはjava.lang.Iterable.
    したがって、内部foreachではIterable反復器が直接呼び出されます.これにより、foreachでcollectionを遍歴する場合、collection.remove()は使用できません.以下で検証します.
    for (String i : list) {
        System.out.println(i);
        list.remove(i); //    
    } 

    ここではConcurrentModificationException異常が投げ出されました
  • これにより、Iteratorの遍歴方法
  • を用いることができる.
    コードは次のとおりです.
    Iterator it=list.iterator();
    while (it.hasNext()){
        System.out.println(it.next());
        it.remove(); //   
    }

    ここではIterator独自のremoveメソッドを使用しています.問題は発生しません.
    まとめ
  • ループクエリのみを行う場合foreachを使用してコード
  • を簡略化することができる.
  • 削除操作に関してforeachで問題が発生する場合は、Iterator
  • を使用する必要があります.