一点一点看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,进行统一特点解析
完毕,以上!
转载于:https://www.cnblogs.com/liuyuhangCastle/p/9595022.html
一点一点看JDK源码(二)java.util.List相关推荐
- JDK源码笔记-java.util.HashMap
2019独角兽企业重金招聘Python工程师标准>>> HashMap 的存储实现 当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片段为例: Java代 ...
- 【JDK源码】java.util.concurrent.atomic包常用类详解
java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方 ...
- JDK源码解析 - java.util.ArrayList
1.实现接口 public class ArrayList<E> extends AbstractList<E>implements List<E>, Random ...
- JDK源码(FutureTask)——java.util.concurrent(十)
测试代码: https://github.com/kevindai007/springboot_houseSearch/tree/master/src/test/java/com/kevindai/j ...
- 再来一篇,看jdk源码大师亲自操刀编写的集合源码
本文首发于公众号[看点代码再上班],欢迎围观,第一时间获取最新文章. 全文共计1959字18图,预计阅读时间13分钟 大家好,我是tin,这是我的第8篇原创文章 这个图拍摄于老家县城一售楼处.作为外出 ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach
一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...
- 一点一点看JDK源码(四)java.util.ArrayList 中篇
一点一点看JDK源码(四)java.util.ArrayList 中篇 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 在前篇中 ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate
一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点 ...
- 面试有没有看过spring源码_如何看Spring源码、Java每日六道面试分享,打卡第二天...
原标题:如何看Spring源码.Java每日六道面试分享,打卡第二天 想要深入的熟悉了解Spring源码,我觉得第一步就是要有一个能跑起来的极尽简单的框架,下面我就教大家搭建一个最简单的Spring框 ...
最新文章
- 一个用WPF做的简单计算器源代码
- mysql decs倒叙查询_mysql按照日期方式查询
- SAP CRM Fiori应用My Note的OData调用设计
- -bash: id: command not found -bash: tty: command not found
- arcgis制作空间变化图怎么做_听说如果做数据分析不用GIS,会被开?
- 原来python中实现语音识别如此简单!
- Mac下和Windows下UnrealEngine 4体验对比
- python编程和继承_python面向对象编程-继承与派生
- 图形面积用计算机软件计算方法,AutoCAD2018如何算面积 计算图形面积教程
- c语言正弦波程序_DAC0832的波形信号发生器Proteus仿真设计,正弦波、三角波、方波和锯齿波...
- C语言删除注册表某个键值,怎么批量快速删除注册表中指定的某个键值
- 怎么用js代码画一棵树,附带下载链接
- Flink DataStream Keyed和Non-Keyed窗口、WindowAssigner、窗口生命周期、窗口函数、迟到数据和窗口结果的处理
- (翻译)关系型数据库工作原理(二)
- wow7.1 xd 新手教程
- CANopen eds模型总结
- windows笔记本重置网络
- 金字塔决策交易系统里实现股票交易策略实盘自动下单方法
- 百度文库里面的文档无法复制,如果要下载需要下载券,如何免费复制文档呢?
- c语言编程六度空间,六度空间理论的图论法证明及应用