1、什么是迭代器
迭代器实际上是一种设计模式,廖老师的博客是这样解释的:
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
在java的集合中广泛的使用迭代器。
2、为什么要用迭代器
使用迭代器的好处是可以在不需要了解集合内部的实现过程的情况下实现对集合的遍历;另一方面,具体来看如果使用索引的方式遍历LinkedList会效率很低,set集合则无法使用索引,所以综合来看,最好是使用迭代器来遍历集合
3、怎么用迭代器
集合提供了获取迭代器的方法:
- 基本使用:
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("aa");
list.add("bb");
list.add("cc");
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
}
使用foreach循环实际上也是使用迭代器,编译器编译完后就是上面的代码
4、注意事项
- 在需要遍历集合并删除集合元素时可能会报异常:
ConcurrentModificationException
- 代码如下
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("aa");
list.add("bb");
list.add("cc");
int temp = 1;
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
if(temp == 2){
list.remove();
}
temp++;
System.out.println(it.next());
}
}
上面代码会报异常:ConcurrentModificationException
,因外调用的是list
集合的remove()
方法;
怎么避免异常:
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("aa");
list.add("bb");
list.add("cc");
int temp = 1;
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
System.out.println(it.next());
if(temp == 1){
it.remove();
}
temp++;
}
}
注意:it.next();
要在it.remove();
前面。不然会报错IllegalStateException
;
这里最好把迭代器当作一个遍历链表的过程,it就是一个指针(java没有指针的概念),如下图
进入for循环时it
指向-1的位置,进来后需要手动it.next();
到第一个元素位置,这样就比较好理解了
总结:
- 迭代器最好只用来遍历,遍历的过程中不要删除集合中的元素;
- foreach(增强for)也是用迭代器实现的,使用过程中也要注意上面一点,并且他不能完成删除元素的;
- 真要删除元素时,注意for循环的写法和,next()与remove()的位置;