JAVA面试Iterator和ListIterator的区别
我们来用一个非常通俗易懂的方式讲解Iterator和 ListIterator的区别。
你可以把它们想象成两种不同功能的“书签”。
一、用一个比喻来理解
假设你有一本书(这个书就相当于Java中的List集合,比如 ArrayList或LinkedList)。
Iterator (普通书签)
它就像是一个最基础的书签,只有一个主要功能:帮你记住你读到哪一页了,然后让你一页一页地往后翻。
它能做什么?
hasNext(): 问你:“后面还有页吗?”
next(): 帮你翻到下一页,并告诉你这一页的内容。
remove(): 把你当前看的这一页从书上撕掉。这是它唯一能修改书的行为。
它不能做什么?
不能往前翻。一旦翻过去了,就回不来了。
不能在阅读的过程中往书里加一页新内容。
不能修改某一页上的内容(除了撕掉整页)。
ListIterator (高级智能书签)
这是一个功能强大的智能书签。它继承了普通书签的所有功能,并且额外增加了很多高级功能。
它额外能做什么?
双向移动:不仅可以向后翻(next()),还可以向前翻 (previous())。
hasPrevious(): 问你:“前面还有页吗?”
previous(): 帮你翻到上一页。
获取位置:告诉你现在精确的页数(索引)。
nextIndex(), previousIndex()
修改内容:允许你用笔修改当前这一页上的文字,而不仅仅是撕掉整页。
set(E e): 修改当前遍历到的元素。
添加内容:允许你在当前的位置插入一页全新的内容。
add(E e): 添加一个新元素,这个新元素会立刻出现在你刚看的那一页和即将要看的那一页之间。
二、什么时候用哪个?
用Iterator:
当你只是简单地想遍历一个集合(不一定是List,也可以是Set),并且过程中可能只需要删除某些元素时。这是最常用、最通用的选择。
// 遍历一个Set,并删除元素
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String item = it.next();
if (item.equals("bad")) {
it.remove(); // 使用迭代器安全删除
}
}
用ListIterator:
当你需要遍历一个List,并且需求比较复杂时:
需要反向遍历(从后往前)。
需要在遍历过程中替换(修改)某个元素的值。
需要在遍历过程中插入(添加)新的元素。
// 遍历一个List,修改和添加元素
ListIterator<String> listIt = list.listIterator();
while (listIt.hasNext()) {
String item = listIt.next();
if (item.equals("world")) {
listIt.set("Java"); // 把 "world" 修改成 "Java"
}
if (item.equals("hello")) {
listIt.add("inserted"); // 在 "hello" 后面插入 "inserted"
}
}
// 现在还可以反向再遍历回去
while (listIt.hasPrevious()) {
System.out.println(listIt.previous());
}
三、核心要点记住这三点就够了:
功能上:Iterator是基础版(只能向前、删除);ListIterator 是豪华版(可前后、可增删改)。
范围上:Iterator可用于所有集合;ListIterator 只用于List。
关系上:ListIterator是Iterator的儿子,功能更强。
相关文章
- Spring Boot中对接Twilio以实现发送验证码和验证短信码
- Spring Boot 3.5:这次更新让你连配置都不用写了,惊不惊喜?
- Spring Boot+Pinot实战:毫秒级实时竞价系统构建
- SpringBoot敏感配置项加密与解密实战
- SpringBoot 注解最全详解,建议收藏!
- Spring Boot 常用注解大全:从入门到进阶
- SpringBoot启动之谜:@SpringBootApplication如何让配置化繁为简
- Springboot集成Kafka原理_spring集成kafka的原理
- Spring Boot中@Data注解的深度解析与实战应用
- 大佬用1000字就把SpringBoot的配置文件讲的明明白白!