在阅读 List / ArrayList 源代码过程中,做了下面的笔记。 LinkedList 的笔记较多,放到了另一篇博文 LinkedList / Queue- 源代码学习笔记

List

List 是一个接口,继承自 Collection 接口。接口是对功能的定义,没有具体实现。List 接口有以下几个特点

1. 可以存在重复的元素。这点和 Set 是不一样的,Set 接口不允许重复的元素出现。

2. 有四个根据下标访问的方法 : get(int), set(int, E), add(int, E), remove(int).

3. 提供特殊的 Iterator —— ListIterator 。ListIterator 迭代器允许在遍历元素过程中插入元素、替换元素,以及双向遍历。ListIterator 特性用得少,一般使用 Iterator 足够。

4. toArray() 方法返回的是 List 元素的副本,对副本进行操作,不会影响原来的 List 。

ArrayList

1. ArrayList 是 List 接口的一个实现,是一个基于可变大小的 Array 的 List 实现。

2. Array 是大小固定的数据结构, ArrayList 通过申请新的 Array 空间并将就的数据复制到新的 Array 上,来实现内置的 Array 大小可变。

3. 由于基于 Array,所以仅通过下标访问并不改变结构的 get(int), set(int, E) 可以在常量时间下完成。add 方法平均情况下是常量时间复杂度,即添加 n 个元素需要时间为 O(n) 。add(int) 是在末尾追加,除了需要扩大内置 Array 外,添加效率很快;add(int, E) 在中间插入,每次都需要对插入点后面的所有元素往后移移位,效率慢一些。

4. iterator 采用 fail-fast 设计思路。在 iterator 由 iterator() 或 listIterator() 返回后,如果绕过 iterator 的 remove 和 add ,对 List 进行结构性变动,iterator 就会抛出 ConcurrentModificationException 异常。fail-fast 一般体现在并发情况下,在单线程情况下也可以重现,如下面方法被执行时,会抛出 ConcurrentModificationException 指向第 14 行代码。

     public static void main(){
List<String> list = new ArrayList<>(); list.add("aa");
list.add("bb"); Iterator<String> iter = list.iterator();
if (iter.hasNext()){
System.out.println(iter.next());
} list.add("dd");
if (iter.hasNext()){
System.out.println(iter.next());
}
}

5. 声明实现了 RandomAccess 接口。RandomAccess 是一个标记接口,也就是没有任何成员方法、成员变量的声明,仅仅表示拥有随机访问的属性。随机访问有利于一些算法的性能优化。在泛型算法实现中,先通过 instanceof 来判断 List 是否有随机访问的属性,然后选择更合适的算法实现。

Jdk 版本: jdk1.8.0_31.jdk

[Java] List / ArrayList - 源代码学习笔记的更多相关文章

  1. [Java] LinkedList / Queue - 源代码学习笔记

    简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...

  2. [Java] Map / HashMap - 源代码学习笔记

    Map 1. 用于关联 key 和 value 的对象,其中 key 与 key 之间不能重复. 2. 是一个接口,用来代替 Java 早期版本中的 Dictionary 抽象类. 3. 提供三种不同 ...

  3. Java后端高频知识点学习笔记1---Java基础

    Java后端高频知识点学习笔记1---Java基础 参考地址:牛_客_网 https://www.nowcoder.com/discuss/819297 1.重载和重写的区别 重载:同一类中多个同名方 ...

  4. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  5. jQuery源代码学习笔记_工具函数_noop/error/now/trim

    jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...

  6. Java超简明入门学习笔记(一)

    Java编程思想第4版学习笔记(一) 第二章 一切都是对象(Hello World)          这个笔记本主要记录了我在学习Java编程思想(第4版,中文版)的过程中遇到的重难点及其分析.主要 ...

  7. 《Java编程思想》学习笔记(二)——类加载及执行顺序

    <Java编程思想>学习笔记(二)--类加载及执行顺序 (这是很久之前写的,保存在印象笔记上,今天写在博客上.) 今天看Java编程思想,看到这样一道代码 //: OrderOfIniti ...

  8. Java程序猿JavaScript学习笔记(2——复制和继承财产)

    计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...

  9. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

随机推荐

  1. 注册表修改IP地址和DNS等信息

    ---------------------win8系统 1. 2. 3. --------------------------------------------------------------- ...

  2. Windows上帝模式

    在桌面新建一个文件夹 按F2重命名为 GodMode.{ED7BA470-8E54-465E-825C-99712043E01C} 完成

  3. IOS常用CGRect的交错,边缘,中心的检测

    转自:http://tsyouaschen.iteye.com/blog/1946957 判断给定的点是否被一个CGRect包含,可以用CGRectContainsPoint函数 BOOL conta ...

  4. 使用下拉列表框<select>标签,节省空间

    下拉列表在网页中也常会用到,它可以有效的节省网页空间.既可以单选.又可以多选.如下代码: 讲解: 1.value: 2.selected="selected": 设置selecte ...

  5. MySQL 创建数据表

    MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: CREATE TABLE table_name (col ...

  6. 比较两个字符,相等输出yes,不相等输出no

    DATA SEGMENTSHOW1 DB 'YES$'SHOW2 DB 'NO$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATABEGIN: MOV AX,DA ...

  7. openstack VM可以ping外部网络,但是外部网络ping不通VM

    经过无数次的尝试,终于搭建好了完整的Openstack,本来VM可以获取到IP地址,但是等到我大功告成的时候,突然发现外部网络却不能ping进VM,我可是整整折腾了我几个通宵,这是哭啊.然而,皇天不负 ...

  8. recvmsg和sendmsg函数

    这两个函数是最通用的I/O函数.实际上我们把所有read.readv.recv和recvfrom调用替换成recvmsg调用.类似地,各种输出函数调用也可以替换成sendmsg调用 #include ...

  9. 如何根据Jquery实现两级联动

    <script language="javascript" type="text/javascript" > $(function (){      ...

  10. dede 留言板访问的目录

    D:\APMServ5.2.6\www\htdocs\xyhy\templets\plus guestbook.rar   文件 里面  DEDE留言簿的插件: