java的Iterator源码浅析
2023-09-14 09:11:44 时间
在java的集合中,List接口继承Collection接口,AbstractList类实现了List接口,在AbstractList中的内部类Itr实现了Iterator接口
ArrayList实现List接口并继承AbstractList类,结构图如下:(图片出自网络)
Iterator接口源码:
public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } }
AbstractList的内部类Itr实现了Iterator接口,如下所示:
private class Itr implements Iterator<E> { /**元素的下标 * Index of element to be returned by subsequent call to next. */ int cursor = 0; /**上一个元素的下标。如果元素已被删除就设置为-1 * Index of element returned by most recent call to next or * previous. Reset to -1 if this element is deleted by a call * to remove. */ int lastRet = -1; /**允许修改的次数,违规操作会抛异常 * The modCount value that the iterator believes that the backing * List should have. If this expectation is violated, the iterator * has detected concurrent modification. */ int expectedModCount = modCount; /*检查是否还有下一个元素*/ public boolean hasNext() { return cursor != size(); } /*光标下移,并且返回当前的元素*/ public E next() { checkForComodification(); try { int i = cursor; E next = get(i); lastRet = i; cursor = i + 1; return next; } catch (IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } /*移除元素*/ public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { AbstractList.this.remove(lastRet); if (lastRet < cursor) cursor--; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException e) { throw new ConcurrentModificationException(); } } final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } }
ArrayList中的iterator()方法:
public Iterator<E> iterator() { return new Itr(); }
ArrayList中的内部类Itr源码功能类似于AbstractList的内部类Itr。
阅读了Iterator的源码,再回头看Iterator遍历List的过程,理解就会深刻很多。
List<String> list=new ArrayList<String>();
list.add("apple"); list.add("banana"); list.add("watermelon");
for (Iterator<String> iterator=list.iterator();iterator.hasNext();) {
System.out.println( iterator.next());
}
相关文章
- maven 上传 java工程源码到私服
- java实现fp-growth算法
- mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
- Java实现 LeetCode 753 破解保险箱(递归)
- Java实现 LeetCode 661 图片平滑器(暴力)
- Java实现 蓝桥杯VIP 算法提高 聪明的美食家
- Java实现 蓝桥杯VIP 算法训练 暗恋
- Java高级面试题及答案
- 图解 Java IO : 一、File源码
- 【JAVA】基于MVC架构Java技术荟萃案例演练
- java集合框架11——TreeMap和源码分析(二)
- [Java] HashMap源码分析
- k8s 通用的java项目迁移流程
- How to improve Java's I/O performance( 提升 java i/o 性能)
- Java项目练习:后台管理系统——管理员管理模块(附源码下载地址)
- Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释
- 《Java并发编程实战》第七章 取消与关闭 读书笔记
- java.lang.OutOfMemoryError: Java heap space
- Java Instrumentation 内存马——主要是利用Instrumentation Java API来做内存注入,会用到反射机制,文中提到检测思路:注入jar包-> dump已加载class字节码->反编译成java代码-> 源码webshell检测
- Java 读写锁 ReentrantReadWriteLock 源码分析
- ZZNUOJ_用Java编写程序实现1924:一大波素数来袭(附源码)
- JAVA开发讲义(一)-Java的自白