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

完毕,以上!

转载于:https://www.cnblogs.com/liuyuhangCastle/p/9595022.html

一点一点看JDK源码(二)java.util.List相关推荐

  1. JDK源码笔记-java.util.HashMap

    2019独角兽企业重金招聘Python工程师标准>>> HashMap 的存储实现 当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片段为例: Java代 ...

  2. 【JDK源码】java.util.concurrent.atomic包常用类详解

    java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方 ...

  3. JDK源码解析 - java.util.ArrayList

    1.实现接口 public class ArrayList<E> extends AbstractList<E>implements List<E>, Random ...

  4. JDK源码(FutureTask)——java.util.concurrent(十)

    测试代码: https://github.com/kevindai007/springboot_houseSearch/tree/master/src/test/java/com/kevindai/j ...

  5. 再来一篇,看jdk源码大师亲自操刀编写的集合源码

    本文首发于公众号[看点代码再上班],欢迎围观,第一时间获取最新文章. 全文共计1959字18图,预计阅读时间13分钟 大家好,我是tin,这是我的第8篇原创文章 这个图拍摄于老家县城一售楼处.作为外出 ...

  6. 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach

    一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...

  7. 一点一点看JDK源码(四)java.util.ArrayList 中篇

    一点一点看JDK源码(四)java.util.ArrayList 中篇 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 在前篇中 ...

  8. 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate

    一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点 ...

  9. 面试有没有看过spring源码_如何看Spring源码、Java每日六道面试分享,打卡第二天...

    原标题:如何看Spring源码.Java每日六道面试分享,打卡第二天 想要深入的熟悉了解Spring源码,我觉得第一步就是要有一个能跑起来的极尽简单的框架,下面我就教大家搭建一个最简单的Spring框 ...

最新文章

  1. 一个用WPF做的简单计算器源代码
  2. mysql decs倒叙查询_mysql按照日期方式查询
  3. SAP CRM Fiori应用My Note的OData调用设计
  4. -bash: id: command not found -bash: tty: command not found
  5. arcgis制作空间变化图怎么做_听说如果做数据分析不用GIS,会被开?
  6. 原来python中实现语音识别如此简单!
  7. Mac下和Windows下UnrealEngine 4体验对比
  8. python编程和继承_python面向对象编程-继承与派生
  9. 图形面积用计算机软件计算方法,AutoCAD2018如何算面积 计算图形面积教程
  10. c语言正弦波程序_DAC0832的波形信号发生器Proteus仿真设计,正弦波、三角波、方波和锯齿波...
  11. C语言删除注册表某个键值,怎么批量快速删除注册表中指定的某个键值
  12. 怎么用js代码画一棵树,附带下载链接
  13. Flink DataStream Keyed和Non-Keyed窗口、WindowAssigner、窗口生命周期、窗口函数、迟到数据和窗口结果的处理
  14. (翻译)关系型数据库工作原理(二)
  15. wow7.1 xd 新手教程
  16. CANopen eds模型总结
  17. windows笔记本重置网络
  18. 金字塔决策交易系统里实现股票交易策略实盘自动下单方法
  19. 百度文库里面的文档无法复制,如果要下载需要下载券,如何免费复制文档呢?
  20. c语言编程六度空间,六度空间理论的图论法证明及应用

热门文章

  1. 【Linux远程管理】RDP协议远程管理
  2. WCF存储图片到指定文件夹下
  3. java 数据类型之原码,补码,反码
  4. Best Practices
  5. ubuntu8.04 升级到8.10后,apache2 不能用的解决办法
  6. C#文件和目录的操作
  7. php内容模型概念,方便新建各种类型表
  8. Spring 整合 Disruptor 第一个版本
  9. 也来学学插件式开发续-利用MEF
  10. BZOJ4337 : BJOI2015 树的同构