zoukankan      html  css  js  c++  java
  • 【JDK】JDK源码分析-List, Iterator, ListIterator

    List 是最常用的容器之一。之前提到过,分析源码时,优先分析接口的源码,因此这里先从 List 接口分析。List 方法列表如下: 

    由于上文「JDK源码分析-Collection」已对 Collection 接口的方法进行了简要分析,而 List 接口继承自 Collection,因此这里只分析一些 List 特有的方法:

    // 将一个集合的所有元素添加到当前集合的指定位置;
    boolean addAll(int index, Collection<? extends E> c);
    
    // 用指定的运算结果替代集合中的所有元素
    default void replaceAll(UnaryOperator<E> operator);
    
    // 用指定的 Comporator 对集合元素进行排序
    default void sort(Comparator<? super E> c);
    
    // 获取指定位置的元素
    E get(int index);
    
    // 将某个位置的元素替换为指定元素
    E set(int index, E element);
    
    // 将指定元素添加到集合的指定位置
    void add(int index, E element);
    
    // 移除指定位置的元素
    E remove(int index);
    
    // 某个元素在集合中(第一次出现)的位置
    int indexOf(Object o);
    
    // 某个元素在集合中最后一次出现的位置
    int lastIndexOf(Object o);
    
    // 返回元素的列表迭代器
    // 相当于 list.listIterator(0)
    ListIterator<E> listIterator();
    
    // 返回元素的 listIterator(指定起始位置)
    ListIterator<E> listIterator(int index);
    
    // 获取集合的子集
    List<E> subList(int fromIndex, int toIndex);

    由于这里涉及到了 ListIterator 接口,而它又继承自 Iterator 接口,因此对这两个接口也进行简要分析,同时也算为后续分析 ArrayList 等实现类做些准备工作。这两个接口的继承结构如下:

    Iterator 接口是用于遍历集合元素的迭代器,它替代了 JCF 中的 Enumeration 接口。其方法概述如下:

    // 是否有更多元素
    boolean hasNext();
    
    // 返回迭代的下一个元素
    E next();
    
    // 从底层集合中删除此迭代器返回的最后一个元素(可选操作)
    // 每次调用 next() 时只能调用一次此该方法
    default void remove();
    
    // 对剩余的每个元素执行给定的操作
    default void forEachRemaining(Consumer<? super E> action);

    ListIterator,列表的迭代器,继承自 Iterator,可以从列表的两端进行遍历(Iterator 只能从前到后)。它在 Iterator 基础上增加方法如下:
    // 是否有前一个元素(可理解为从后往前遍历)
    boolean hasPrevious();
    
    // 获取前一个元素
    E previous();
    
    // 返回对 next() 的后续调用将返回的元素的索引
    // 如果列表迭代器位于列表的末尾,则返回列表大小
    int nextIndex();
    
    // 返回对 previous() 的后续调用将返回的元素的索引
    // 如果列表迭代器位于列表的开头,则返回 -1
    int previousIndex();
    
    // 用指定的元素替换 next() 或 previous() 返回的最后一个元素
    void set(E e);
    
    // 插入指定元素到列表中
    void add(E e);

    注意,迭代器的游标在元素之间,如下:

    /*
     *                      Element(0)   Element(1)   Element(2)   ... Element(n-1)
     * cursor positions:  ^            ^            ^            ^                  ^
     */

    二者的区别与联系:

    1. ListIterator 继承自 Iterator.

    2. 都有 remove() 方法,都可以删除对象。

    3. 都有 next() 和 hasNext() 方法,都可以实现向后遍历;而 ListIterator 有 previous() 和 hasPrevious() 方法,可以向前遍历。

    4. ListIterator 有 add() 和 set() 方法,可以向 List 添加和修改元素;而 Iterator 不能。

    小结:

    List 作为集合(Collection),其最主要的特点就是「有序」,可以把它理解为一个数组,因此才能进行许多与位置(下标)相关的操作。

    Stay hungry, stay foolish.

    PS: 本文首发于微信公众号。

  • 相关阅读:
    [Cocos2d-x]Cocos2d-x开发中C++调用Object-c
    [数据结构]基本概念
    [Cocos2d-x]Mac下运行HelloCpp For Android
    [Android] JDK , NDK , JNI
    [Cocos2d-x]坐标系
    [Android]mac下开发环境搭建
    [Cocos2d-x]博客推荐
    nyoj-506-洗澡
    nyoj-479-Coprimes
    nyoj-464-Cookies
  • 原文地址:https://www.cnblogs.com/jaxer/p/11105422.html
Copyright © 2011-2022 走看看