Java:Iterator迭代器的底层实现原理

博主是刚刚学习到集合的小白,如有谬误,请及时在评论区更正,以免误导他人。

迭代器的使用

package Test;

import java.util.ArrayList;
import java.util.Iterator;

public class Test7 {
    
    
    public static void main(String[] args) {
    
    
        // 创建一个集合对象
        ArrayList a1 = new ArrayList();
        // 向集合中添加数据
        a1.add(100);      // 自动装箱就不多说了。
        a1.add(500);
        a1.add(300);
        a1.add(true);
        a1.add("hello world!");
        // 创造集合对象的迭代器对象,并利用迭代器对象进行迭代/遍历集合
        Iterator iterator = a1.iterator();
        while(iterator.hasNext())
        {
    
    
            System.out.println(iterator.next());
        }
    }
}

迭代器疑问

  大家在刚开始接触迭代器时,应该都会有些疑问:
  一、Iterator是个接口,为什么接口可以接收对象?接口不是不能new对象吗?
  二、Java中的API帮助文档中显示,java.util.ArrayList.iterator()方法返回的竟然是一个接口!

知识储备

一、Iterator接口

二、多态
  多态:父类型的引用指向子类型的对象。
三、工具及快捷键
  工具:IDEA
  快捷键:ctrl+点击变量名  快速定位源码
      ctrl+F12         查看当前类中的所有内容
 
通过IDEA工具我们可以快速查找源码,功能十分强大,推荐各位使用!

迭代器原理

第一步: ctrl+点击上方代码中的iterator()方法,跳转至java.util.ArrayList.iterator()源码位置。


    /**
     * Returns an iterator over the elements in this list in proper sequence.
     * The returned iterator is fail-fast
     * return an iterator over the elements in this list in proper sequence
     */
     // 我百度了下翻译
     // 按正确顺序遍历此列表中元素的迭代器
     // 返回的迭代器是fail fast。
     
    public Iterator<E> iterator() {
    
    
        return new Itr();
    }
    

  百度翻译的英文,真的看不懂,不过没关系,我们此时见到了ArrayList.iterator()的源码,调用iterator()其实就是new了一个Itr()对象。
  那么问题又来了,为什么在源码中返回值类型是 “Iterator接口” ,返回的是个 “Itr类” 却不报错?
  基础扎实的人可能很快就会想到Java的多态机制,我们此时可以得出Itr类中实现了Iterator接口的结论,接下来我们去Itr类中验证我们的结论。

第二步: ctrl+点击上方代码中的Itr()构造方法,跳转至java.util.ArrayList.java文件下的Itr类中Itr()源码位置。

    private class Itr implements Iterator<E> {
    
    
    	// 方法体
    	// 内容就不写了
    }

  此时我们看到Itr类实现了Iterator接口,验证了我们的结论,也就是说Iterator接口中的方法Itr中都有。

第三步: 查看Itr类中的方法,ctrl+F12
  

  看图可知:在ArrayList类中还有Itr类,也看到了Itr类实现Iterator接口的方法,当然还有其他的类,这里不做讨论。

结论

        Iterator iterator = a1.iterator();     //其实就是下方的代码扩展。
//      Iterator iterator = new Itr();           运用多态机制,表面上是Iterator接口的对象,实际是Itr类的对象

启发

  一、我们以后遇到接口接收对象时,应该就是运用了多态。
  二、遇到不懂的问题,不如直接看看源代码,毕竟看不懂也没啥损失,万一看懂了呢?

如有谬误,请务必告知,以免误导他人
如果各位看官觉得写得不错,对你有帮助,能不能给个赞啊,这是对我最大的鼓励!

猜你喜欢

转载自blog.csdn.net/weixin_51304266/article/details/116134802
今日推荐