private class Itr implements Iterator<E> {
int cursor; // 调用next方法返回的元素的索引
int lastRet = -1; // 最近一次调用next方法返回的元素的索引(如果没有调用过next方法,这个值等于-1)
int expectedModCount = modCount; Itr() {} /*
*判断光标指向的位置是否还有元素,即迭代器下一次迭代是否还能获取到元素。
*/
public boolean hasNext() {
return cursor != size;
} /*
*返回光标指向位置的元素,然后移动光标。
*/
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
//1、所以调用next方法前需要先调用hasNext方法进行判断——避免抛出异常
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
//2、先移动光标,后返回数值
cursor = i + 1;
//3、lastRest变量记录本次返回的元素在集合中的位置
return (E) elementData[lastRet = i];
} public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification(); try {
//2、从这里可以看出,remove方法移除的是上一次调用next方法返回的元素。
ArrayList.this.remove(lastRet);
cursor = lastRet;
//3、从这里可以看出,remove方法和next方法是紧密相关的。
//只有调用了next方法才能调用remove方法,remove方法不能联系调用,
//下一次调用remove方法前必须调用next方法。
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
} @Override
@SuppressWarnings("unchecked")
public void forEachRemaining(Consumer<? super E> consumer) {
Objects.requireNonNull(consumer);
final int size = ArrayList.this.size;
int i = cursor;
if (i >= size) {
return;
}
final Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length) {
throw new ConcurrentModificationException();
}
while (i != size && modCount == expectedModCount) {
consumer.accept((E) elementData[i++]);
}
// update once at end of iteration to reduce heap write traffic
cursor = i;
lastRet = i - 1;
checkForComodification();
} final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}

最新文章

  1. PR曲线,ROC曲线,AUC指标等,Accuracy vs Precision
  2. 一对多关系domain Model中设置使用AutoMapper时出错
  3. c语言中enum类型的用法
  4. hdu 5691 Sitting in Line 状压dp
  5. 【SQLite】使用事务处理带参数的插入
  6. 开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本号公布
  7. oracle一个用户密码管理多达同意三次企图登录
  8. telnet发电子邮件
  9. C# 在本地创建文件夹及子文件夹
  10. Python之路【第二篇】:Python基础(二)
  11. devcpp中很简单的排序
  12. 漫谈Linux标准的文件系统(Ext2/Ext3/Ext4)
  13. MongoDB自学(4)
  14. NTP时间服务器实战应用详解-技术流ken
  15. JavaList addAll removeAll
  16. python logging日志模块
  17. UVALive 8519 Arrangement for Contests 2017西安区域赛H 贪心+线段树优化
  18. SQL注入学习资料总结
  19. MySQL常用SQL语句优化
  20. personalblog

热门文章

  1. java基础-内存分配
  2. @atcoder - Japanese Student Championship 2019 Qualification - F@ Candy Retribution
  3. Linux 正文处理命令及tar命令 利用vi编辑器创建和编辑正文文件
  4. [Offer收割]编程练习赛108 - 树上的最短边 树链剖分
  5. @noi.ac - 489@ shuffle
  6. JS判断在哪一端浏览器打开
  7. SSM项目整合第一步 注册登陆实现
  8. java项目和npm项目命令窗口部署方便调试
  9. pytorch实现BiLSTM+CRF用于NER(命名实体识别)
  10. Spring Boot笔记之邮件(spring-boot-starter-mail)