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

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

liuyuhang原创,未经容许进制转载java

 

本文举例使用的是JDK8的API编程

 

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

1.综述多线程

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

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

  List的特点是在结婚的任何位置增长或 删除元素都比较快,自己并不仅是随机存取。ide

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

 

  java.util.List是一个接口,该接口继承了Collection接口,所以一样方法,做为接口只是定义规范不一样。工具

  实际的不一样要看独特的定义或独特的实现才能够。post

 

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

 

完毕,以上!