• 一点一点看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,进行统一特点解析

    完毕,以上!

  • 相关阅读:
    进程,线程(thread)
    PHP权限分配思路
    xml simpleXML_load_file(), simpleXML_load_string()
    XML基础
    php QQ登录
    ci验证码
    jquery中的 .html(),.val().text()
    ci 用本身 email 类发 email
    Objective-C 装饰模式--简单介绍和使用
    Objective-C 外观模式--简单介绍和使用
  • 原文地址:https://www.cnblogs.com/liuyuhangCastle/p/9595022.html
Copyright © 2020-2023  润新知