迭代器
是一种设计模式,提供了一种方法,来对集合,容器进行遍历
不需要关注底层数据结构和数据类型,来达到底层和上层遍历解耦的目的
iterator迭代器方法介绍:
boolean hasNext() :判断集合是否还有元素
E next() :返回当前数据
void remove() :删除元素
注意:使用时hasNext、next需要轮循出现(hasNext、remove也是一样)
要自定义迭代器类
类要具有iterator方法 需要实现iterable接口
需要实现implements Iterator接口
并发异常问题:ConcurrentModificationException
原因:集合本身修改会引起modCount版本号的修改,而迭代器本身的版本号副本并未改变,因此会抛出该异常
fail-fast(快速失败机制)和 fail-safe(安全失败机制)
Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。
java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。
快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。
fail-fast机制,是一种错误检测机制。
它只能被用来检测错误,因为JDK并不保证fail-fast机制一定会发生。
若在多线程环境下使用fail-fast机制的集合,建议使用“java.util.concurrent包下的类”去取代“java.util包下的类”。
迭代器的简单使用
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(12);
arrayList.add(45);
arrayList.add(33);
arrayList.add(44);
arrayList.add(89);
//通过for遍历
for (int i = 0; i < arrayList.size(); i++) {
System.out.print(arrayList.get(i)+" ");
}
System.out.println();
//通过迭代器遍历
Iterator<Integer> iterator = arrayList.iterator();
while (iterator.hasNext()) {
Integer value = iterator.next();
// if (value == 33) {
// arrayList.remove(Integer.valueOf(33));
// }
// iterator.remove();
// iterator.remove();
System.out.print(value+" ");
}
System.out.println();
System.out.println("size:" + arrayList.size());
//增强for循环(底层是通过迭代器实现的)
for (Integer i :arrayList) {
System.out.print(i+" ");
}
System.out.println();
//正序和逆序遍历
System.out.print("next: ");
ListIterator<Integer> listIterator = arrayList.listIterator();
while (listIterator.hasNext()) {
listIterator.nextIndex();//找元素对应的索引位置
System.out.print(listIterator.next() + " ");
}
System.out.println();
System.out.print("previous: ");
ListIterator<Integer> listIterator1 = arrayList.listIterator(arrayList.size());
while (listIterator1.hasPrevious()) {
listIterator1.previousIndex();
System.out.print(listIterator1.previous() + " ");
}
}