`

ArrayList 迭代器模式

阅读更多
在面试中,迭代器被问到了很多次,今天来总结一下。

从一个例子说起。
 public static void main(String args[]){
    	List list=new ArrayList();
    	
    	list.add(2);
    	list.add(5);
    	list.add(7);
    	
    	Iterator Itr=list.iterator();
    	while(Itr.hasNext()){
    		System.out.println(Itr.next());
    	}
    }


上面的例子很简单,但说明了迭代器最基本的结构:
1. 得到迭代器;
2. 判断是否有元素;
3. 获取元素。

现在到源码里去看它们是怎样实现的。

 public Iterator<E> iterator() {
        return new Itr();
    }


其实它里面有一个内部类的,再看这个类的成员有哪些。

  // 初始值为0,这个与C语言不一样,C是不确定的值
  int cursor;       // index of next element to return
  int lastRet = -1; // index of last element returned; -1 if no such
  int expectedModCount = modCount;


下面是hasNext()方法的实现。
 public boolean hasNext() {
            return cursor != size;
 }



简单吧,就是判断当前的指针是否到最后了,我们猜测当前指针的变化应该是在next()方法中实现的。

public E next() {
            checkForComodification();
            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];
 }


其中的elementData是存储数据的地方,这个在开始就定义了。

private transient Object[] elementData;


这个数组的初始化在什么时候完成的呢?在你new的时候,默认大小是10.

public ArrayList() {
        this(10);
 }


总体来讲,迭代器还是比较简单的吧。
分享到:
评论

相关推荐

    java迭代器模式实现正反向遍历

    用java编写的迭代器,实现10数字正反向遍历。

    java迭代器

    java迭代器 文章目录java迭代器Iterator 迭代器接口迭代器的方法:next():返回迭代中的下一个元素。hasNext():如果迭代具有更多元素...迭代器模式,就是为容器而生。 Iterator仅用于遍历集合,lterator本身并不提供

    Java设计模式之Iterator模式

    2.定义一个Iterator迭代器的接口 3.定义一个ArrayList,实现Collection接口,并写一个实现了Iterator接口的内部类。 4.编写测试程序TestMain 从以上可以看出,设计模式到处用到面向对象中的多态。接口调用子类中的...

    C#特性-迭代器(上)及一些研究过程中的副产品

    提到迭代器我们不能不想到迭代器模式,那我就以迭代器模式作为开场白. 在我们的应用程序中常常有这样一些数据结构: 它们是一个数据的集合,如果你知道它们内部的实现结构就可以去访问它们,它们各自的内部存储结构互不...

    java中set、list和map的使用方法实例

    // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该对象的内部细节。 // 学习set对象容器的使用 // set容器...

    二十三种设计模式【PDF版】

    设计模式之 Iterator(迭代器) 这个模式已经被整合入Java的Collection.在大多数场合下无需自己制造一个Iterator,只要将对象装入Collection中, 直接使用 Iterator 进行对象遍历。 设计模式之 Template(模板方法) ...

    algorithm-samples:简单算法

    迭代器 泳池 辛格尔顿 原型 观察者模式 装饰图案 搜索 二元搜寻 种类 气泡 合并 数数 基数 快的 随机数发生器 LCG: : Java功能: 注解 自定义ArrayList,HashMap(以及更多)实现 克隆 定制比较器 一些常见的...

    大数据面试题.pdf

    反射有三种获取的⽅式,分别是:forName / getClass / 直接使⽤class⽅式 使⽤反射可以获取类的实例 1-6)列出⾄少五种设计模式 设计⽅式有⼯⼚法,懒加载,观察者模式,静态⼯⼚,迭代器模式,外观模式、、、、 1-...

    java内部学习笔记.docx

    4.15 Iterator迭代器 42 4.16泛型 43 4.17增强型for循环 43 4.18 List高级-数据结构:Queue队列 44 4.19 List高级-数据结构:Deque栈 44 4.20 Set集合的实现类HashSet 45 4.21 Map集合的实现类HashMap 46 4.22单例...

    Java完美编程(第3版).pdf

    本书是为全英文版本。 《Java完美编程(第3版)》,英文名《Absolute Java (3rd Edition)》,英文版出版社:Addison ...第16章 稽核,映射和迭代器 第17章 初探swing  第18章 深入swing 第19章 java的发展永无止境

    cs2-lab4-wordcount-java:Loyola COMP 271实验4

    迭代器,策略和适配器设计模式 使用说明 在本实验中,您将有机会完成一个工具,该工具可以计算从标准输入中读取的单词的频率。 然后,该工具以降序打印(最多)10个最常见的单词及其频率。 例: Run &gt; Run main ...

    Lab8-carolinacervantes

    迭代器,策略和适配器设计模式 指示 在本实验中,您将有机会完成一个工具,该工具可以对从标准输入中读取的单词的频率进行计数。 然后,该工具以降序打印(最多)10个最常见的单词及其频率。 例子: ./build/...

    史上最全java面试,103项重点知识,带目录

    31. 迭代器 Iterator 是什么? 12 32. Iterator 怎么使用?有什么特点? 12 33. Iterator 和 ListIterator 有什么区别? 13 三、多线程 13 35. 并行和并发有什么区别? 13 36. 线程和进程的区别? 14 37. 守护线程是...

    asp.net知识库

    C#2.0-迭代器 C#2.0 的新增功能学习 泛型的序列化问题 .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: ...

    leetcode备忘录系统-Problem-Solving:解决问题的实践档案

    ArrayList 和可调整大小的数组 字符串生成器 链表 创建链表 从单向链表中删除节点 “跑者”技术 递归问题 堆栈和队列 实现堆栈 引入队列 树和图 树的种类 二叉树遍历 二叉堆(最小堆和最大堆) 尝试(前缀树) 图表 ...

Global site tag (gtag.js) - Google Analytics