Java中的 Iterator 迭代器

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 https://blog.csdn.net/weixin_43863007/article/details/88846854
迭代器是一种设计模式,它是一个对象,可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构
1. Iterator 接口中定义的几个常用方法:
  • next():获取序列中的下一个元素
  • hasNext():检查序列中是否还有元素
  • remove():将迭代器返新返回的元素删除
2. 使用 Iterator 迭代器遍历集合中的元素:
public static void main(String[] args) {
         List<String> list = new ArrayList<String>();
         list.add("张三1");
         list.add("张三2");
         list.add("张三3");
         list.add("张三4");
         //使用迭代器遍历ArrayList集合
         Iterator<String> listIt = list.iterator();
         while(listIt.hasNext()){
             System.out.println(listIt.next());
         }
}
3. Iterator 和 ListIterator 的区别是什么:
  • Iterator 可以用来遍历Set和List集合,而ListIterator只能用来遍历List
  • Iterator 对集合只能是前向遍历,ListIterator 既可以前向遍历也可以后向遍历
  • Listiterator 实现了Iterator 接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等
4. 快速失败 和 安全失败 的区别是什么:
4.1 快速失败(fail–fast):
  • 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的结构进行了修改(增加,删除),则会抛出ConCurrentModificationExecption
  • 原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个modCount变量,集合在被遍历期间如果发生结构变化,就会改变modCount的值,每当迭代器使用hasNext()/next() 遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,使得话就返回遍历:否则抛出异常,终止遍历
  • 注意:这里异常的抛出条件是检测到modCount!=expectedmodCount这个条件,如果集合发生变化时修改modCount值,刚好设置为了expectedmodCount值,则异常不会抛出,因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug
  • 场景:Java.util包下的集合类都是快速失败的,不能再多线程下发生并发修改
4.2 安全失败(fail–safe):
  • 采用安全失败机制的集合容器,在遍历时不时直接在集合内容上访问的,而是先复制原有集合内容,再拷贝的集合上进行遍历
  • 原理:由于迭代时对原集合的拷贝进行遍历,所以在遍历过程中对原集合所做的修改并不能被迭代器检测,所以不会触发异常
  • 缺点:基于拷贝内容的优点是避免了异常,单同样的,迭代器并不能访问到修改后的内容,即迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的
  • 场景:Java.util.concurrent包下的容器是安全失败,可以在多线程下并发使用,并发修改

猜你喜欢

转载自blog.csdn.net/weixin_43863007/article/details/88846854