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
// 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 it=list.iterator();
while (it.hasNext()){
System.out.println(it.next());
it.remove(); //
}
ここではIterator独自のremoveメソッドを使用しています.問題は発生しません.
まとめ