一点一点看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的剖析,请看我上一篇文章
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,进行统一特点解析
完毕,以上!