java中迭代器的原理图解和源码浅析

本文解析了为何迭代器采用接口而非实现类形式的原因,探讨了不同集合类型遍历方式的差异性,以及如何通过接口抽象共通操作并由具体集合类内部实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

a:迭代器为什么定义了一个接口而不是实现类?
  假如把迭代器定义为一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历了。
  但是,java中提供了很多的集合类,而这些集合类的数据结构是不同,所以它们的存储方法也是不同的,
  进而它们的遍历方法也是不一样的,最终就没有把迭代器定义为一个类了。
  (因为定义成一个迭代器类就是一个具体的实现了,既然是具体实现那么它们的遍历方式就是一样的了)

  而无论是那种集合,都应该具备获取元素的功能,并且最好辅助以判断的功能,这样在获取前,先判断,就不容易出错。
  也就是说,判断和获取功能应该是一个集合遍历所具备的,而每种集合的遍历方式又不太一样,
  所以把这两个功能给提取出来,并不提供具体的实现,而这种方式叫做接口。

  那么,真正的具体的实现类在哪里呢?
  在真正的具体的子类中,是以内部类的方式体现的。
  (因为在子类中要包含两个方法)
  如下图所示:


b:迭代器的内部类实现源码浅析

-----------------------------------------------------------------------------
public interface Inteator {
    public abstract boolean hasNext(); // 注意:默认方法前有public abstract修饰,是接口中方法的默认修饰符
    public abstract Object next();     // 注意:默认方法前有public abstract修饰,是接口中方法的默认修饰符
}

public interface Iterable {
    Iterator iterator(); // 没有具体实现,注意:默认方法前有public abstract修饰,是接口中方法的默认修饰符
}
-----------------------------------------------------------------------------
public interface Collection extends Iterable {
    Iterator iterator(); // 没有具体实现,注意:默认方法前有public abstract修饰,是接口中方法的默认修饰符
}

public interface List extends Collection {
    Iterator iterator(); // 没有具体实现,注意:默认方法前有public abstract修饰,是接口中方法的默认修饰符
}
-----------------------------------------------------------------------------
public class ArrayList implements List {
    public Iterator iterator() { // 具体实现
        return new Itr();
    }
    
    private class Itr implements Iterator { // Itr是Iterator接口的实现类
        public boolean hasNext() {}
        public Object next(){} 
    }
}
-----------------------------------------------------------------------------
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator();     // new Itr();
while(it.hasNext()) {
    String s = (String)it.next();
    System.out.println(s);
}
-----------------------------------------------------------------------------

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值