java.util.Iterator 是集合迭代器,提供 hasNext()、next()、remove() 三个核心方法。 下面分:基础使用、自定义类实现 Iterable+Iterator(手写迭代器)两套示例。
1. 集合自带 Iterator 基础用法
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("SpringBoot");
list.add("MySQL");
list.add("Redis");
// 获取迭代器
Iterator<String> iterator = list.iterator();
// hasNext() 判断是否还有下一个元素
while (iterator.hasNext()) {
// next() 返回下一个元素
String item = iterator.next();
System.out.println(item);
// remove() 删除迭代器当前指向的元素,不能在for-each中删除
if ("MySQL".equals(item)) {
iterator.remove();
}
}
System.out.println("删除之后:" + list);
}
}
注意:不要在
while循环里多次调用next();并发修改会抛出ConcurrentModificationException。
2. 自定义容器,实现 Iterable,手写 Iterator(重点)
如果自己写一个数据容器,想要支持 for‑each 循环,需要实现 Iterable<T>,重写 iterator() 返回自定义迭代器对象; 自定义迭代器实现 Iterator<T> 接口。
import java.util.Iterator;
/**
* 自定义简单数组容器,实现Iterable,可以使用for-each遍历
* @param <T>
*/
class MyArrayContainer<T> implements Iterable<T> {
private final T[] array;
private final int size;
@SuppressWarnings("unchecked")
public MyArrayContainer(int size) {
this.size = size;
array = (T[]) new Object[size];
}
public void set(int index, T value) {
if(index <0 || index >= size){
throw new IndexOutOfBoundsException();
}
array[index] = value;
}
public T get(int index) {
return array[index];
}
public int getSize(){
return size;
}
/**
* 返回自定义迭代器,实现Iterable必须重写此方法
* @return Iterator
*/
@Override
public Iterator<T> iterator() {
// 返回内部类迭代器实例
return new MyIterator();
}
/**
* 自定义迭代器内部类,实现 Iterator<T>
*/
private class MyIterator implements Iterator<T> {
// 当前遍历游标
private int cursor = 0;
/** 是否还有下一个元素 */
@Override
public boolean hasNext() {
return cursor < size;
}
/** 获取下一个元素,游标向后移动 */
@Override
public T next() {
if (!hasNext()) {
throw new java.util.NoSuchElementException();
}
return array[cursor++];
}
/** 删除当前元素,可选实现,默认抛出异常 */
@Override
public void remove() {
throw new UnsupportedOperationException("暂不支持删除");
}
}
}
public class CustomIteratorDemo {
public static void main(String[] args) {
MyArrayContainer<String> container = new MyArrayContainer<>(4);
container.set(0,"A");
container.set(1,"B");
container.set(2,"C");
container.set(3,"D");
// 方式1:使用Iterator手动遍历
Iterator<String> it = container.iterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
System.out.println();
// 方式2:因为实现了Iterable,支持for‑each增强for循环
for(String s : container){
System.out.print(s + " ");
}
}
}
3. Iterator 核心方法说明
表格
Java 8+ Iterator 新增默认方法
forEachRemaining(Consumer<? super E> action),示例:
Iterator<String> iter = list.iterator();
iter.forEachRemaining(System.out::println);
4. Iterator 与 ListIterator 简单区分
Iterator:只能单向向后遍历,所有集合都可用ListIterator:List 专属,可以向前 / 向后遍历,支持 add、set 修改元素,有索引。
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
ListIterator<Integer> listIt = list.listIterator(list.size());
// 反向遍历
while (listIt.hasPrevious()){
System.out.println(listIt.previous());
}
}
}
关键知识点总结
Iterator是迭代器,Iterable是可迭代对象;只有实现Iterable的类才能使用 for‑each。迭代器是游标模式,不存储数据,只是遍历容器。
遍历过程中不要直接用集合修改元素,要用迭代器自带的
remove(),否则触发并发修改异常。
本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。
原文链接
欢迎访问