zoukankan      html  css  js  c++  java
  • java中迭代器的原理图解和源码浅析

    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);
    }
    -----------------------------------------------------------------------------
  • 相关阅读:
    reStructuredText学习
    PYTHON编码处理-str与Unicode的区别
    如何参与一个GitHub开源项目?
    Boost库编译安装
    git push失败the remote end hung up unexpectedly
    VBox虚拟机安装debian
    debian设置英文模式
    python 使用json.dumps() 的indent 参数添加缩进空格数,格式化字符串后输出
    unittest之装饰器 @classmethod
    jmeter正则提取信息头数据
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/8613473.html
Copyright © 2011-2022 走看看