Java容器类源码分析之Iterator与ListIterator迭代器(基于JDK8)

一、基本概念

创新互联公司成立与2013年,是专业互联网技术服务公司,拥有项目成都做网站、网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元伊吾做网站,已为上家服务,为伊吾各地企业和个人服务,联系电话:028-86922220

  

    迭代器是一个对象,也是一种设计模式,Java有两个用来实实现迭代器的接口,分别是Iterator接口和继承自Iterator的ListIterator接口。实现迭代器接口的类的对象有遍历集合对象,选择集合中的元素和删除集合中元素的方法。而在使用它时不必知道该集合对象底层的结构。Java类库中实现Iterator接口的迭代器只能正向遍历集合中的元素,而实现ListIterator接口的迭代器不仅能够正向遍历,还能够反向遍历集合中的元素。

 

二、源码分析

 

2.1、Iterator接口与ListIterator接口的继承与实现

 

Java容器类源码分析之Iterator与ListIterator迭代器(基于JDK8)

 

图2.1  Java迭代器类的继承与接口实现(部分)

 

    ListIterator接口继承了Iterator接口。在AbstractList、ArrayList和Vector这三个类中的内部类ListItr实现了ListIterator接口,这三个类的内部类ListItr又分别继承了在这三个类中实现了Iterator接口的内部类Itr。实现ListIterator的类还有LinkedList的内部类ListItr。实现Iterator的类还有LinkedList的内部类DescendingIterator,HashMap的内部类EntryIterator,KeyIterator,ValueIterator,以及TreeMap的内部类PrivateEntryIterator等。

2.2、迭代器接口方法

       

        1)迭代器的向前移动与向后移动图解

 

Java容器类源码分析之Iterator与ListIterator迭代器(基于JDK8)

 

         2)Iterator接口方法


  Iterator 

   UnsupportedOperationException("remove" 

  forEachRemaining(Consumer

 

       3)ListIterator接口方法

 

  ListIterator  Iterator hasNext();

    
   
     nextIndex();

     previousIndex();

    

     set(E e);

     add(E e);}

 

2.3、容器类与迭代器的关系

 

       1)Iterator接口。阅读源码可知,Collectiion接口实现了Iterable接口,Iterable有一个返回一个Iterator对象的iterator()方法,所以继承和实现了Collection接口的所有容器类及其子类和实现类都有一个返回Iterator对象的的iterator()方法。Java中有很多容器类中都设计有实现了Iterator接口的内部类,如ArrayList和LinkedList等类。HashMap和TreeMap类中也包含有实现了Iterator的内部类,来对Map中的KeySet、Value和EntrySet进行迭代。Iterable接口的源代码如下:

  forEach(Consumer (T t :  Spliterator Spliterators.spliteratorUnknownSize(iterator(), 0

        2)ListIterator接口。查看源码可以发现,List接口中有两个返回ListIterator对象的方法,如下。List接口下的的ArrayList和LinkedList都有返回ListIterator对象的方法。

 

ListIterator listIterator();//实现这个方法,该方法返回一个ListIterator迭代器对象,迭代器初始化后,一般迭代器位于在容器第一个元素后面。ListIterator listIterator(int index);//实现这个方法,返回一个指定了开始遍历容器时迭代器初始位置的ListIterator迭代器对象

 

 

  • ArrayList类设计有实现了ListIterator接口的内部类ListItr(不过ArrayList的listIterator(final int index)方法并未使用这个内部类,而是在方法中又设计了一个ListIterator匿名内部类作为方法返回值,可以发现ArrayList的Iterator()方法也是调用了这个方法来构建迭代器对象)。ArrayList类中部分有关源码如下

    ListItr  Itr  ListIterator=

 

   Iterator ListIterator listIterator(   offset =   ListIterator cursor = lastRet = -1 expectedModCount = ArrayList.  cursor != SubList.

     

  •   LinkedList类也有一个内部类ListItr实现了ListIterator接口,LinkedList的listIterator()方法返回了这个内部类的实例。LinkedList中部分有关源码如下

    public ListIterator listIterator(int index) {
        checkPositionIndex(index);        return new ListItr(index);
    }    private class ListItr implements ListIterator {

 

欢迎工作一到五年的Java工程师朋友们加入Java技术交流:659270626
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,redis,Kafka,MySQL,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

 


网站名称:Java容器类源码分析之Iterator与ListIterator迭代器(基于JDK8)
标题路径:http://scyanting.com/article/iichge.html