zoukankan      html  css  js  c++  java
  • 一点一点看JDK源码(二)java.util.List

    一点一点看JDK源码(二)java.util.List

    liuyuhang原创,未经允许进制转载

    本文举例使用的是JDK8的API

    目录:一点一点看JDK源码(〇)

    1.综述

      List译为表,一览表,列表,目录,名单,有种index的意味在里头

      编程语言中的List是强调线性,可以简单的视为一个双向串行的集合

      List的特色是在结婚的任何位置增加或 删除元素都比较快,本身并不只是随机存取。

      同时,List是众多语言中都提供的常用类库之一。

      java.util.List是一个接口,该接口继承了Collection接口,因此同样方法,作为接口只是定义规范不同。

      实际的不同要看独特的定义或独特的实现才可以。

    2.关注点

      对List的关注,更多的是倾向于其实现类的关注,不仅仅是该接口定义的规范或List本身的特性

      而是对实现类的具体关注。

      根据List的类注释中的@see,发现以下的关注点

    • Collection(父接口)
    • Set(接口)
    • ArrayList(子类实现)
    • LinkedList(子类实现)
    • Vector(子类实现)
    • Arrays#asList(Object[])(工具类转换方法)
    • Collections#nCopies(int, Object)(工具类转换方法)
    • Collections#EMPTY_LIST(工具类转换方法)
    • AbstractList(相关抽象类)
    • AbstractSequentialList(相关抽象类)

      关联的关注点应该主要只有这些,这些都并非源码本身的部分。

      对于Collection的剖析,请看我上一篇文章

      一点一点看JDK源码(一)Collection体系概览

    3.源码剖析

      先上List源码,去掉原doc注释,与Collection中重复的部分不再提及,只对特有的增加注释。

      1 public interface List<E> extends Collection<E> {
      2 
      3   /**
      4   * 定义addAll方法,从某个index开始插入指定集合实例
      5   */
      6   boolean addAll(int index, Collection<? extends E> c);
      7 
      8   /**
      9   * 定义removeAll方法,从某个index开始删除指定集合实例
     10   */
     11   boolean removeAll(Collection<?> c);
     12 
     13   /**
     14   * 定义removeAll方法,从某个index开始删除指定集合实例
     15   */
     16   boolean retainAll(Collection<?> c);
     17 
     18   /**
     19   * jdk1.8新增
     20   * 大意为:
     21   * 定义replaceAll方法,根据传递参数的函数式,传递内容是接口类型
     22   * 该接口定义了operator函数,该函数传递给Objects.requireNonNull进行判断
     23   * 匹配成功则进行set值进行替换,使用List迭代器进行迭代替换
     24   * @since 1.8
     25   */
     26   default void replaceAll(UnaryOperator<E> operator) {
     27     Objects.requireNonNull(operator);
     28     final ListIterator<E> li = this.listIterator();
     29     while (li.hasNext()) {
     30     li.set(operator.apply(li.next()));
     31     }
     32   }
     33 
     34   /**  
     35   * jdk1.8新增
     36   * 大意为:
     37   * 定义sort方法,根据传递参数的函数式,传递内容是接口类型
     38   * 该接口定义了Comparator函数,该函数传递给Arrays.sort进行判断并排序
     39 
     40   * 并根据排序结果,使用迭代器迭代并重新set进List
     41   * @since 1.8
     42   */
     43   @SuppressWarnings({"unchecked", "rawtypes"})
     44   default void sort(Comparator<? super E> c) {
     45     Object[] a = this.toArray();
     46     Arrays.sort(a, (Comparator) c);
     47     ListIterator<E> i = this.listIterator();
     48     for (Object e : a) {
     49       i.next();
     50       i.set((E) e);
     51     }
     52   } 
     53 
     54   /**
     55   * List要求,定义get方法,获取指定index的值
     56   */
     57   E get(int index);
     58 
     59   /**
     60   * List要求,定义set方法,在指定index的元素设置为目标元素
     61   */
     62   E set(int index, E element);
     63 
     64   /**
     65   * List要求,定义add方法,在指定index添加指定元素
     66   */
     67   void add(int index, E element);
     68 
     69   /**
     70   * List要求,定义remove方法,从指定的index删除该元素并重新调整List
     71   */
     72   E remove(int index);
     73 
     74   /**
     75   * List要求,定义indexOf方法,正序查询指定元素第一次出现的index序号
     76   */
     77   int indexOf(Object o);
     78 
     79   /**
     80   * List要求,定义lastIndexOf方法,倒叙查询指定元素第一次出现的的index序号
     81   */
     82   int lastIndexOf(Object o);
     83 
     84   /**
     85   * List要求,定义ListIterator迭代器方法,获取该List的迭代器
     86   */
     87   ListIterator<E> listIterator();
     88 
     89   /**
     90   * List要求,定义ListIterator迭代器方法,获取从指定index开始的指定迭代器
     91   */
     92   ListIterator<E> listIterator(int index);
     93 
     94   /**
     95   * List要求,定义subList方法,从起始和结束index拆分出新的list
     96   */
     97   List<E> subList(int fromIndex, int toIndex);
     98 
     99   /**
    100   * jdk1.8新增
    101   * 大意为:
    102   * 根据当前的list内容进行排序,进行迭代器拆分,拆分成新的迭代器
    103   * 用于多线程迭代使用
    104   * @since 1.8
    105   */
    106   @Override
    107   default Spliterator<E> spliterator() {
    108     return Spliterators.spliterator(this, Spliterator.ORDERED);
    109   }

      去掉了从Collection中继承的方法以后,List有一些独特的方法,不管是add,set,remove,sub等等。

      List接口中定义的这些方法特点是直接和index相关,由于由于是有序的,所以index相当于一种搜索方式

      因此List有对指定元素进行操作方便的特点。

    下一篇更新的文章将对ArrayList,Vector,LinkedList,进行统一特点解析

    完毕,以上!

  • 相关阅读:
    ZOJ 3818 Pretty Poem
    HDU 4597 Play Game
    HDU 4497 GCD and LCM
    CSU 1335 高桥和低桥
    UVA 10791 Minimum Sum LCM
    CSU 1119 Collecting Coins
    CSU 1120 病毒
    UVA 12169 Disgruntled Judge
    HDU 1301 Jungle Roads
    POJ 1258 Agri-Net
  • 原文地址:https://www.cnblogs.com/liuyuhangCastle/p/9595022.html
Copyright © 2011-2022 走看看