迭代器(Iterator)是 Java 集合框架中用于遍历集合元素的工具。在 Java 中,迭代器是通过实现java.util.Iterator接口来实现的。让我们一起来分析一下迭代器的源码。
java.util.Iterator
首先,我们来看一下java.util.Iterator接口的源码:
public interface Iterator<E> { boolean hasNext(); E next(); void remove(); }
这是一个泛型接口,用于迭代元素的类型是E。接口定义了三个方法:
E
hasNext()
true
false
next()
remove()
接口定义了迭代器的基本操作,但具体的实现是在集合类中。下面是一个简单的示例,展示如何使用迭代器遍历集合:
List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); }
上述示例中,我们通过iterator()方法获取了集合list的迭代器,并使用hasNext()和next()方法进行遍历。
iterator()
list
对于不同的集合类,迭代器的实现可能会有所不同。例如,ArrayList和LinkedList的迭代器实现方式是不同的。在ArrayList中,迭代器是通过内部类Itr实现的,而在LinkedList中,迭代器是通过内部类ListItr实现的。
ArrayList
LinkedList
Itr
ListItr
不同实现的迭代器可能会有额外的方法或属性,用于支持特定集合类的操作。但基本的迭代器操作如hasNext()、next()和remove()是通用的。
希望这个简单的源码分析能帮助你理解 Java 迭代器的工作原理。如果你对特定的迭代器实现有更深入的疑问,可以进一步研究相应集合类的源码。
当然,我可以继续为您提供更多有关Java迭代器源码的信息。
让我们以ArrayList为例,深入探讨它的迭代器实现。在ArrayList中,迭代器是通过ArrayList的内部类Itr实现的。下面是Itr类的简化版本:
private class Itr implements Iterator<E> { int cursor; // 迭代器的指针位置 int lastRet = -1; // 上一个元素的索引位置 public boolean hasNext() { return cursor != size(); } public E next() { int i = cursor; if (i >= size()) { throw new NoSuchElementException(); } Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) { throw new ConcurrentModificationException(); } cursor = i + 1; return (E) elementData[lastRet = i]; } public void remove() { if (lastRet < 0) { throw new IllegalStateException(); } checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } final void checkForComodification() { // 检查ArrayList的修改次数与迭代器的期望修改次数是否一致 if (modCount != expectedModCount) { throw new ConcurrentModificationException(); } } }
在ArrayList的Itr类中,我们可以看到以下几点关键信息:
cursor
lastRet
此外,还有一个checkForComodification()方法用于检查ArrayList的修改次数(modCount)和迭代器的期望修改次数(expectedModCount)是否一致,以防止在迭代过程中集合被并发修改。
checkForComodification()
modCount
expectedModCount
需要注意的是,不同的集合类可能会有不同的迭代器实现方式,这取决于集合类的内部数据结构和迭代逻辑。因此,如果您对其他集合类的迭代器实现感兴趣,可以进一步查看相应类的源代码。
原文链接:codingdict.net