一点一点看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中重复的部分不再提及,只对特有的增加注释。

 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的更多相关文章

  1. JDK1.8源码(二)——java.util.LinkedList

      LinkedList定义 LinkedList 是链表实现的线性表(双链表),元素有序且可以重复. public class LinkedList<E> extends Abstrac ...

  2. 一点一点看JDK源码(六)java.util.LinkedList前篇之链表概要

    一点一点看JDK源码(六)java.util.LinkedList前篇之链表概要 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.什么 ...

  3. 一点一点看JDK源码(三)java.util.ArrayList 前偏

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

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

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

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

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

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

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

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

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

  8. 一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历

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

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

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

随机推荐

  1. JavaScript里面的居民们2-字符串

    基于HTML,实现需求 按照HTML中按钮的描述以此实现功能 计算结果显示在 id 为 result 的 P 标签中 <!DOCTYPE html> <html> <he ...

  2. 洛谷P1072 Hankson 的趣味题(数学)

    题意 题目链接 Sol 充满套路的数学题.. 如果你学过莫比乌斯反演的话不难得到两个等式 \[gcd(\frac{x}{a_1}, \frac{a_0}{a_1}) = 1\] \[gcd(\frac ...

  3. ElementUI组件库常见方法及问题汇总(持续更新)

    本文主要介绍在使用ElementUI组件库的时候,常遇见的问题及使用到的方法,汇总记录便于查找. 1.表单 阻止表单的默认提交 <!-- @submit.native.prevent --> ...

  4. Mysql与web之间的数据、查询等个问题

    Mysql与web之间的数据.查询等个问题 在自己写的一个jsp主页连接数据库出现的各种问题,写记下来与大家分享,共勉.最后附jdbc代码. ---DanlV Error 1---错误代码: java ...

  5. CentOS 7运维管理笔记(7)----Apache 基于端口的虚拟主机配置

    如果一台服务器只有一个IP或需要通过不同的端口访问不同的虚拟主机,可以使用基于端口的虚拟主机配置. (1) 在虚拟机的CentOS7服务器上配置 eth0:4 为192.168.1.214: (2) ...

  6. Windows系统中Oracle11g R2 版本数据库卸载

    1. 停止"服务"中所有的ORCLE服务. 进入服务的方法很多,如: (1)在运行中输入services.msc,然后找到所有跟oracle 有关的服务. (2)开始->设置 ...

  7. Dubbo框架介绍与安装 Dubbo 注册中心(Zookeeper-3.4.6)

    背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. • 单一应用架构 • 当网站流量很小时, ...

  8. javascript tips and snippets

    如何给javascript对象动态创建动态key // ES2015 var key = 'DYNAMIC_KEY', obj = { [key]: 'ES6!' }; console.log(obj ...

  9. Python学习---进程 1225

    进程创建 进程创建: 第一种:直接创建 第二种:利用类来实现 第一种:直接创建 from multiprocessing import Process import time def f(name): ...

  10. Mysql学习---视图/触发器/存储过程/函数/执行计划/sql优化 180101

    视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由 ...