欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深入理解Java迭代器Iterator

程序员文章站 2022-03-06 18:36:40
迭代器一、Iterator二、源码剖析Iterator三、迭代器API四、特殊迭代器五、增强for循环、foreach一、Iterator概述:由Java容器继承体系结构图可知,Iterator是一个接口,它是迭代器的基本接口。但在Collection接口中继承的是Iterable接口。二、源码剖析Iterator1、Iterator是迭代器的基本接口,而在Collection接口中继承的是Iterable接口,不过Iterable中有iterator()这个方法,返回的是Iterator。说明It...

一、Iterator

概述:由Java容器继承体系结构图可知,Iterator是一个接口,它是迭代器的基本接口。但在Collection接口中继承的是Iterable接口。

二、源码剖析Iterator

1、Iterator是迭代器的基本接口,而在Collection接口中继承的是Iterable接口,不过Iterable中有iterator()这个方法,返回的是Iterator。说明Iterable接口中定义了获取迭代器Iterator的方法,该方法由实现该接口的实现类实现。
深入理解Java迭代器Iterator
2、既然涉及到Iterator接口,进入该接口可看到:有四个方法:hasNext()、next()、remove()、forEachRemaining,并且只有hasNext和next未实现。
深入理解Java迭代器Iterator
3、如果通过深入继承关系(如继承关系:Collection->List->AbstractCollection实现类中匿名对象ListIterator将该两个方法进行了实现)。
深入理解Java迭代器Iterator
4、当我们深入了(Collection接口->List接口->AbstractCollection抽象类->ArrayList实现类),我们在ArrayList下找到了iterator实现的身影:它是在ArrayList以内部类Itr(ListIterator继承了Iterator)的方式实现的!(AbstractCollection抽象类中匿名对象ListIterator实现的两个方法是在其他类用到AbstractCollection类时才会实现,但在ArrayList中是没有实现的。 )并且,从源码可知:Iterator实际上就是在遍历集合。
深入理解Java迭代器Iterator
5、接下来可以深入剖析遍历集合的Iterator(其他的如Set的Iterator也是同样的分析思路),有时间再详解。

三、迭代器API

概述:所有实现了Collection接口的容器类都有一个iterator()方法用以返回一个实现了Iterator接口的对象,这个对象可以是多种类型,不同的Collection实现类型遍历方式不同(用于遍历集合类)。
个人理解方式:迭代器就好像链表的指针,每次获取并创建iterator()方法就返回一个集合的头指针。
深入理解Java迭代器Iterator

  • Iterator方法
//判断游标右边是否有元素,有就返回true,没有就返回false
boolean hasNext();
//返回游标右边的元素并将游标移动到下一个位置
E next();
//删除游标左边的元素,在执行完next之后该操作只能执行一次
//Iterator对象的remove方法是在迭代过程中删除元素的唯一安全的方法
default void remove()
  • 使用步骤重点(只要实现了Collection接口都可以使用Iterator遍历):
 1.使用集合对象中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)2.使用Iterator接口中的方法hasNext判断还有没有下一个元素。
 3.使用Iterator接口中的方法next取出集合中的下一个元素。

四、特殊迭代器

List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问previous()方法就是获取访问前一个元素,解决了Iterator 只能next()向后访问的问题)。还提供了一个方法(如下)来获取从列表中指定位置开始的列表迭代器。
以查看ArrayList源码为例(以内部类形式实现了ListIterator):

  • 以指定位置获取迭代器的遍历:
//返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始(这是另一种从指定的位置获取到迭代器,部分情况可以减少遍历的开销)
ListIterator <E> listIterator(int index)
private class ListItr extends Itr implements ListIterator<E> {
    ListItr(int index) {
        .....
    }

    public boolean hasPrevious() {
        .....
    }

    public int nextIndex() {
        .....
    }

    public int previousIndex() {
        .....
    }

    /**
    * 提供了迭代器向前访问的功能,可以双向访问了
    */
    @SuppressWarnings("unchecked")
    public E previous() {
        .....
    }

    public void set(E e) {
        .....
    }

    public void add(E e) {
        .....
    }
}

五、增强for循环、foreach

1、增强for循环:底层使用的也是迭代器,使用for循环的格式,简化了迭代器的书写是JDK1.5之后出现的新特性。
2、foreach是Iterable接口中的一个默认方法,

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}
  • 因此继承了Collection接口的接口或实现类都可以使用。
  • 使用方法
1.使用集合对象调用forEach()方法,方法的参数传递的是消费方法(一个接口而已),可使用匿名实现该接口。
2.JDK8中可以使用lambda实现该接口传递一个消费工程。

记录不易,先留个赞吧!!!!

本文地址:https://blog.csdn.net/weixin_44987871/article/details/111870888

相关标签: Java