迭代器中的方法:
hasNext()----判断是否有元素,如果有元素可以迭代,返回true,则返回false
next()----- 返回迭代的下一个元素
迭代循环集合元素
获取的迭代器对象,迭代器用来遍历集合,此时相当于对当前集合的状态拍了一个快照,只有再次调用迭代器时,快照才会更新
第一步:获取集合对象的迭代器对象
Collection al=new ArrayList(); 创建一个集合
al.add(20);
al.add("asd");
al.add(100);
Iterator it=al.iterator(); 获取迭代器对象
第二步:通过获取的迭代器对象开始遍历集合
通过hasNext()方法判断是否有元素,在通过next()获取当前地址元素
while(it.hasNext()){
Object oj=it.next();
System.out.println(oj);
}
注意:
存到集合中是什么类型,取出来还是什么类型。 只不过在输出的时候会转换成字符串。因为这里println会调用tostring()方法。
迭代器删除元素
例:
List l=new ArrayList();
l.add(1);
l.add(2);
Iterator it=l.iterator();
while(it.hasNext()){
Integer i=it.next();
l.remove(i);
}
结果:
异常: java.util.ConcurrentModificationException
原因分析: 删除元秦之后,集合的结构发生了变化,应该重新去获取迭代器。但是,循环下一次的时候并没有重新获取迭代器,所以会出现异常:
java.util.ConcurrentModificationExce出异常根本原因是:集合中元素删除了,但是没有更新迭代器(迭代器不知道集合变化了),l.remove(o)直接通过集合去删除元素,没有通知迭代器。(导致迭代器的快照和原集合状态不同。)
删除方法修改:
(迭代器删除)
while(it.hasNext()){
Integer i=it.next();
it.remove(i);
}
迭代器去删除时,会自动更新迭代器,并且更新集合(删除集合中的元素)。it2.remove(),删除的一定是迭代器指向的当前元素。
结论:
- 集合结构只要发生改变,迭代器必须重新获取。