首先比较一下 for循环 增强for循环 iterator
增强for循环和iterator遍历的效果是一样的,也就说 增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容,不能获取下标等
可以看下面的例子:
/**
* 用加强的for循环遍历
* @param list
*/
public static void methodStrongFor(List<Integer> list) {
for (Integer x : list)
if (x % 2 == 0)
list.remove(x);
System.out.println(list);
}
/**\
* 用iterator遍历
* @param list
*/
public static void methodIterator(List<Integer> list) {
Iterator<Integer> itr = list.iterator();
while (itr.hasNext()) {
Integer next = itr.next();
if (next % 2 == 0) {
itr.remove();
}
}
System.out.println(list);
}
方法:methodStrongFor()运行时会抛异常java.util.ConcurrentModificationException
方法: methodIterator()正常运行。
原因分析:因为增强的for循环内部就是调用iterator实现的,在遍历的时候就将list转化为了迭代器,当迭代器被创建之后,如果从结构上对列表修改除非通过迭代器自身的remove()、add()方法,其他任何时间任何方式的修改,迭代器都会抛出ConcurrentModificationException异常
iterator好处:
Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构
用iterator迭代能遍历并选择集合中的每个对象而不改变集合的结构
Map的两种遍历方法
如下列:
/**
* 用keySet方法遍历
*/
public static void keySetMethod() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key4", "value4");
map.put("key3", "value3");
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
System.out.println(key + " : " + map.get(key));
}
}
/**
* 用entrySet方法遍历
*/
public static void entrySetMethod() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key4", "value4");
map.put("key3", "value3");
System.out.println(map);
// 遍历map
Iterator<Entry<String, Object>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, Object> entry = iterator.next();
System.out.println(entry.getKey() + " : " + entry.getValue());
}
System.out.println(map);
}