迭代器Iterator解析

你好,我是吴计可师,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累

文章可能会比较长,主要解析的非常详解,或涉及一些底层知识,供面试高阶难度用。可以根据自己实际理解情况合理取舍阅读


Iterator 是 Java 集合框架中的一个接口,定义了遍历集合元素的一些基本方法。它允许通过统一的方式遍历任何实现了 Collection 接口的集合类(如 ArrayList、HashSet、LinkedList 等)。Iterator 提供了访问集合元素的功能,并且支持在遍历过程中删除元素。


01
Iterator 接口的定义


Iterator 接口位于 java.util 包中,包含以下核心方法:

hasNext():

描述:检查集合中是否还有下一个元素。

返回值:如果有下一个元素,返回 true;如果没有,返回 false。

boolean hasNext();


next():

描述:返回集合中的下一个元素,并将游标向前移动。

返回值:返回下一个元素。

抛出异常:如果没有下一个元素(即调用 hasNext() 返回 false),则会抛出 NoSuchElementException。

next();


remove():

描述:删除迭代过程中最后返回的元素。此方法是可选的,意味着不是所有实现了 Iterator 的集合类都会支持此操作。

抛出异常:如果在调用 next() 之前没有调用 remove(),或者如果集合本身不支持删除操作,会抛出 IllegalStateException。

void remove();

0

2
Iterator 的主要作用


遍历集合:Iterator 提供了一种通用的遍历方式,可以遍历任何实现了 Collection 接口的集合类。

修改集合:通过 remove() 方法,Iterator 允许在遍历时删除元素,避免了并发修改异常的问题。

示例代码

示例 1:使用 Iterator 遍历 ArrayList

import java.util.*;public class IteratorExample {    public static void main(String[] args) {        // 创建一个 ArrayList        List<String> list = new ArrayList<>();        list.add("A");        list.add("B");        list.add("C");        // 获取 Iterator 对象        Iterator<String> iterator = list.iterator();                // 使用 Iterator 遍历集合        while (iterator.hasNext()) {            System.out.println(iterator.next());  // 输出 A B C        }    }}


示例 2:使用 Iterator 删除元素

import java.util.*;public class IteratorRemoveExample {    public static void main(String[] args) {        List<String> list = new ArrayList<>();        list.add("A");        list.add("B");        list.add("C");        // 获取 Iterator 对象        Iterator<String> iterator = list.iterator();                // 删除元素 "B"        while (iterator.hasNext()) {            String element = iterator.next();            if (element.equals("B")) {                iterator.remove();  // 使用 Iterator 删除元素            }        }        System.out.println(list);  // 输出 [A, C]    }}


03
Iterator 的优点


统一接口:Iterator 提供了一个统一的接口来遍历不同类型的集合,可以使用相同的方式遍历 List、Set、Queue 等。

安全删除:通过 Iterator 的 remove() 方法,可以避免在遍历过程中直接修改集合引起的并发修改异常(ConcurrentModificationException)。

避免 IndexOutOfBoundsException:与直接使用 for 循环遍历集合不同,Iterator 不依赖于索引,避免了索引越界的问题。


04
Iterator 和其他遍历方式的比较


与 for-each(增强型 for)比较:

  • for-each 是对 Iterator 的一种简化,它的优势是代码简洁,但它不支持在遍历过程中删除元素。

  • Iterator 提供了更多的控制能力(如删除操作),但需要显式地调用 hasNext() 和 next()。

// 使用增强型 forfor (String item : list) {    System.out.println(item);}


与 ListIterator 比较:


  • ListIterator 是 Iterator 的子接口,专门用于 List 类型的集合,提供了更多的功能,如双向遍历(hasPrevious() 和 previous() 方法)、修改元素(set())以及插入新元素(add())。

  • Iterator 只能向前遍历,而 ListIterator 支持双向遍历。

  • Iterator 适用于所有 Collection 类,而 ListIterator 仅适用于 List 类型的集合。


结论

Iterator 是一个非常重要的接口,广泛应用于 Java 集合框架中。它提供了统一、通用的遍历方法,并且可以在遍历过程中安全地删除元素。如果你需要遍历集合并进行删除操作,Iterator 是一个非常有效的工具。

今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

谈谈id那些事(五)——美团的 Leaf 的ID生成


一个阿里二面面试官必问的问题


谈谈id那些事(三)——阿里巴巴的 TDDL的ID生成


分享面试:mysql数据库索引失效的情况


面试常被忽略的问题——内存区域划分