一点一点看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的剖析,请看我上一篇文章
3.源码剖析
先上List源码,去掉原doc注释,与Collection中重复的部分不再提及,只对特有的增加注释。
public interface List<E> extends Collection<E> {
/**
* 定义addAll方法,从某个index开始插入指定集合实例
*/
boolean addAll(int index, Collection<? extends E> c);
/**
* 定义removeAll方法,从某个index开始删除指定集合实例
*/
boolean removeAll(Collection<?> c);
/**
* 定义removeAll方法,从某个index开始删除指定集合实例
*/
boolean retainAll(Collection<?> c);
/**
* jdk1.8新增
* 大意为:
* 定义replaceAll方法,根据传递参数的函数式,传递内容是接口类型
* 该接口定义了operator函数,该函数传递给Objects.requireNonNull进行判断
* 匹配成功则进行set值进行替换,使用List迭代器进行迭代替换
* @since 1.8
*/
default void replaceAll(UnaryOperator<E> operator) {
Objects.requireNonNull(operator);
final ListIterator<E> li = this.listIterator();
while (li.hasNext()) {
li.set(operator.apply(li.next()));
}
}
/**
* jdk1.8新增
* 大意为:
* 定义sort方法,根据传递参数的函数式,传递内容是接口类型
* 该接口定义了Comparator函数,该函数传递给Arrays.sort进行判断并排序
* 并根据排序结果,使用迭代器迭代并重新set进List
* @since 1.8
*/
@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
/**
* List要求,定义get方法,获取指定index的值
*/
E get(int index);
/**
* List要求,定义set方法,在指定index的元素设置为目标元素
*/
E set(int index, E element);
/**
* List要求,定义add方法,在指定index添加指定元素
*/
void add(int index, E element);
/**
* List要求,定义remove方法,从指定的index删除该元素并重新调整List
*/
E remove(int index);
/**
* List要求,定义indexOf方法,正序查询指定元素第一次出现的index序号
*/
int indexOf(Object o);
/**
* List要求,定义lastIndexOf方法,倒叙查询指定元素第一次出现的的index序号
*/
int lastIndexOf(Object o);
/**
* List要求,定义ListIterator迭代器方法,获取该List的迭代器
*/
ListIterator<E> listIterator();
/**
* List要求,定义ListIterator迭代器方法,获取从指定index开始的指定迭代器
*/
ListIterator<E> listIterator(int index);
/**
* List要求,定义subList方法,从起始和结束index拆分出新的list
*/
List<E> subList(int fromIndex, int toIndex);
/**
* jdk1.8新增
* 大意为:
* 根据当前的list内容进行排序,进行迭代器拆分,拆分成新的迭代器
* 用于多线程迭代使用
* @since 1.8
*/
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, Spliterator.ORDERED);
}
去掉了从Collection中继承的方法以后,List有一些独特的方法,不管是add,set,remove,sub等等。
List接口中定义的这些方法特点是直接和index相关,由于由于是有序的,所以index相当于一种搜索方式
因此List有对指定元素进行操作方便的特点。
下一篇更新的文章将对ArrayList,Vector,LinkedList,进行统一特点解析
完毕,以上!
一点一点看JDK源码(二)java.util.List的更多相关文章
- JDK1.8源码(二)——java.util.LinkedList
LinkedList定义 LinkedList 是链表实现的线性表(双链表),元素有序且可以重复. public class LinkedList<E> extends Abstrac ...
- 一点一点看JDK源码(六)java.util.LinkedList前篇之链表概要
一点一点看JDK源码(六)java.util.LinkedList前篇之链表概要 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.什么 ...
- 一点一点看JDK源码(三)java.util.ArrayList 前偏
一点一点看JDK源码(三)java.util.ArrayList liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 ArrayLi ...
- 一点一点看JDK源码(四)java.util.ArrayList 中篇
一点一点看JDK源码(四)java.util.ArrayList 中篇 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 在前篇中 ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach
一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator
一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JD ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList
一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) S ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历
一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看J ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate
一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点 ...
随机推荐
- js为什么放到head中有时候失效
1.今天写js碰到一个奇怪的问题,写好的js放到body里面执行,但是放到head中没有任何效果,为什么导致这种原因呢? 看失效代码: <!DOCTYPE html PUBLIC "- ...
- SASS和SCSS标签详解与scoped局部和全局的使用
首先,学会使用sass: 1.先下载和安装node-sass和一些加载器 $ cnpm install sass-loader node-sass vue-style-loader --D 2.配置w ...
- 理解Canvas原理
Canvas原理 Canvas我们把它翻译成画布,从字面意思我们就可以知道,不就是可以在上面画东西的布吗.好像很简单,没什么好说的.先看图: 从这几幅图我们可以看到以下几点: 1.每个小方格我们可以看 ...
- 原生ajax与封装的ajax使用方法
当我们不会写后端接口来测试ajax时,我们可以使用node环境创建一个本地服务器. 1.创建一个本地服务器可参考http://www.cnblogs.com/heyujun-/p/6793900.ht ...
- for 循环的时候 append() 是移动不是复制
使用for 的时候,append() 不是复制,而是移动,只有最后一个元素才真正的append() 到了 解决办法: 1. 使用字符串: 2.使用clone();
- Glide实现查看图片和保存图片到手机
两种方式, 推荐方式一 方式一 downloadOnly 创建一个 ImageActivity public class ImageActivity extends AppCompatActivity ...
- 阿里云安装jdk报错gzip: stdin: unexpected end of file
在阿里云上面安装jdk时候报了这个问题,如下图所示 然后看了下jdk应该是有150多M的,但是阿里云上面的只有1M多,删除 重新下载... tar zxvf jdk 好了
- 【Leetcode】【Medium】Linked List Cycle II
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. 解题: ...
- C++ int与string的相互转换(含源码实现)
一.int转换成string Ⅰ.to_string函数 c++11标准增加了全局函数std::to_string: string to_string (int val); string to_str ...
- 【转】Java中的String,StringBuilder,StringBuffer三者的区别
https://www.cnblogs.com/su-feng/p/6659064.html 最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及String ...