Java ArrayList迭代器next()方法中elementData[lastRet = i]作用问询
关于ArrayList迭代器next方法中lastRet = i逻辑的解答
lastRet = i 是赋值操作,不是相等判断,你对这段逻辑的疑惑本质是对Java「赋值表达式有返回值」这个语法特性不了解。
1. 语法逻辑解释
- Java中
=是赋值运算符,赋值表达式本身的返回值就是被赋予的值,执行顺序是先完成赋值操作,再返回赋值结果。 - 这里完全没有判断逻辑,所以不可能用
==:如果换成==,方括号里拿到的是布尔值true/false,根本不能作为数组下标,代码直接编译不通过。 - 所以
elementData[lastRet = i]的执行顺序为:- 将局部变量
i的值赋值给迭代器的成员变量lastRet - 把赋值操作的结果(也就是
i的值)作为数组下标,取出elementData中对应位置的元素
- 将局部变量
- 你提到的i=3的场景,执行效果和下面的代码完全等价:
写在方括号里只是JDK源码常用的简写技巧,没有额外的特殊逻辑。lastRet = 3; return (E) elementData[3];
2. 赋值操作的实际作用
lastRet是ArrayList内部迭代器Itr的成员变量,作用是记录上一次调用next()返回的元素的下标,供迭代器的其他方法使用:
- 后续如果调用迭代器的
remove()方法,就会直接用lastRet的值作为下标删除刚刚返回的元素 - 后续如果调用迭代器的
set(E e)方法,也会用lastRet的值作为下标替换对应位置的元素 - 每次调用
next()都会更新lastRet的值,调用remove()/add()之后会把lastRet重置为-1,避免重复调用remove抛出异常
你可以把这段简写的代码拆成可读性更强的写法,功能完全一致:
cursor = i + 1; // 记录本次返回的元素下标,供后续remove/set使用 lastRet = i; // 返回对应下标的元素 return (E) elementData[i];
内容的提问来源于stack exchange,提问作者john_w
相关产品推荐
相关产品推荐

