浅谈迭代器

迭代器

什么是迭代器

以下情况是一种比较常见的迭代

for(int i = 0;i < 10; i++){
    System.out.println(i);
}

这种迭代不具有普适性,因为集合中的set集合是无序、不重复、无索引的。此时的我们就没有利用for循环来进行遍历,像这种情况我们就可以用迭代器的方式来对集合进行遍历。

迭代器

Java迭代器(Iterator)是 Java 集合框架中的一种机制,它提供了一种在不暴露集合内部实现的情况下遍历集合元素的方法。

Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayListHashSet 等集合。

Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。

工作原理

  1. 创建一个类似指针的对象,它会指向当前数据结构的起始位置
  2. 每当调用next()方法,他都会进行一次移动,移动到下一个位置
  3. 接下来不断调用next()方法,迭代器不断向后移动,直到最后一个成员。
  4. 遍历完成之后,它不会进行复位,所以迭代是一次性的。

注意点

  • 报错 NoSuchElementException (当迭代器循环结束后继续使用next()方法就会报错。)
  • 迭代器遍历完成,指针不会复位
  • 循环中只能用一次next
  • 迭代器遍历时,不能用集合的方式进行增加或者删除。可以用迭代器的方式。
  • 迭代器迭代是不依赖索引的。
  • Java 迭代器是一种单向遍历机制,即只能从前往后遍历集合中的元素,不能往回遍历。

针对于注意点1:

NoSuchElementException

常用方法

我们可以在JDK帮助文档中查到Iterator常用的几个方法

调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。

调用 it.hasNext() 用于检测集合中是否还有元素。

调用 it.remove() 将迭代器返回的元素删除。

获取一个迭代器对象

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class A01_CollectionDemo1 {
    public static void main(String[] args) {

		//创建一个集合
        Collection<String> coll = new ArrayList();
		
		//利用add方法添加数据
        coll.add("asd");
        coll.add("zxc");
        coll.add("qwe");

		//获取迭代器对象
        Iterator<String> it = coll.iterator();
		
		//利用迭代器获取到集合中的第一个元素
		System.out.println(it.next());
      
    }
}

循环获取集合元素

while (it.hasNext()){
    String next = it.next();
    System.out.println(next);
}

删除元素

public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(12);
    numbers.add(8);
    numbers.add(2);
    numbers.add(23);
    Iterator<Integer> it = numbers.iterator();
    while(it.hasNext()) {
        Integer i = it.next();
        if(i < 10) {  
            it.remove();  // 删除小于 10 的元素
        }
    }
    System.out.println(numbers);
 }

注意点:

在迭代遍历中不可以以集合的方式进行删除,如果使用集合方式进行删除,将会报错ConcurrentModificationException 并发修改异常。

这个涉及到了 fast-fail 机制(快速失败),可以提前预料遍历失败情况,防止数组越界异常

必须使用迭代器的删除方式 it.remove();

Java中的迭代器用法以及注意点基本就这些,感谢您的观看,希望对您有所帮助。

posted @ 2023-03-17 16:06  戒爱学Java  阅读(31)  评论(0编辑  收藏  举报