如何获取ListIterator.set()源码?ArrayListIterator.set()实现求助
ArrayList ListIterator.set() 源码获取与实现指引
一、获取JDK中ListIterator.set()的源码
- 直接查看JDK安装目录下的
src.zip压缩包,解压后找到java/util/ArrayList.java文件,其中内部类Itr(实现了ListIterator接口)包含set()方法的完整源码。 - 在IDE(如IntelliJ IDEA、Eclipse)中,按住Ctrl键点击代码里的
ListIterator.set()方法,即可直接跳转至关联的JDK源码查看。
二、ArrayListIterator.set()的实现方向指引
核心规则与状态维护
- 状态校验:
set()仅允许在调用过next()或previous()之后执行,若未调用上述方法,或刚执行过add()/remove(),需抛出IllegalStateException。需在迭代器中维护lastRet变量(记录上一次访问的元素索引,初始值为-1),调用next()/previous()时更新lastRet,调用add()/remove()时将lastRet重置为-1。 - 并发修改检查:迭代器需维护
expectedModCount变量,每次执行set()前对比expectedModCount与ArrayList的modCount,若不一致则抛出ConcurrentModificationException(防止迭代过程中集合被非迭代器方法修改)。
具体实现步骤
- 校验
lastRet是否为-1,若是则抛出IllegalStateException。 - 校验
expectedModCount与modCount是否相等,若不等则抛出ConcurrentModificationException。 - 直接将底层数组中
lastRet索引位置的元素替换为传入的element。 - 无需修改
modCount(set()属于元素替换,不改变集合结构)。
常见错误点提示
- 忽略
lastRet的状态校验,导致在不允许的时机调用set()时未抛出异常。 - 未处理并发修改场景,遗漏
expectedModCount与modCount的对比。 - 错误修改了
modCount,导致后续迭代出现异常。
内容的提问来源于stack exchange,提问作者Lexy Morse
相关产品推荐
相关产品推荐

