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

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

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

本文举例使用的是JDK8的API

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 extends Collection{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 *@since1.825   */

26   default void replaceAll(UnaryOperatoroperator) {27 Objects.requireNonNull(operator);28     final ListIterator 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进List41 *@since1.842   */

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 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(intindex);58

59   /**

60 * List要求,定义set方法,在指定index的元素设置为目标元素61   */

62   E set(intindex, E element);63

64   /**

65 * List要求,定义add方法,在指定index添加指定元素66   */

67   void add(intindex, E element);68

69   /**

70 * List要求,定义remove方法,从指定的index删除该元素并重新调整List71   */

72   E remove(intindex);73

74   /**

75 * List要求,定义indexOf方法,正序查询指定元素第一次出现的index序号76   */

77   intindexOf(Object o);78

79   /**

80 * List要求,定义lastIndexOf方法,倒叙查询指定元素第一次出现的的index序号81   */

82   intlastIndexOf(Object o);83

84   /**

85 * List要求,定义ListIterator迭代器方法,获取该List的迭代器86   */

87   ListIteratorlistIterator();88

89   /**

90 * List要求,定义ListIterator迭代器方法,获取从指定index开始的指定迭代器91   */

92   ListIterator listIterator(intindex);93

94   /**

95 * List要求,定义subList方法,从起始和结束index拆分出新的list96   */

97   List subList(int fromIndex, inttoIndex);98

99   /**

100 * jdk1.8新增101 * 大意为:102 * 根据当前的list内容进行排序,进行迭代器拆分,拆分成新的迭代器103 * 用于多线程迭代使用104 *@since1.8105   */

106 @Override107   default Spliteratorspliterator() {108     return Spliterators.spliterator(this, Spliterator.ORDERED);109   }

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

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

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

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

完毕,以上!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值