[Java] List / ArrayList - 源代码学习笔记
在阅读 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 - 源代码学习笔记的更多相关文章
- [Java] LinkedList / Queue - 源代码学习笔记
简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...
- [Java] Map / HashMap - 源代码学习笔记
Map 1. 用于关联 key 和 value 的对象,其中 key 与 key 之间不能重复. 2. 是一个接口,用来代替 Java 早期版本中的 Dictionary 抽象类. 3. 提供三种不同 ...
- Java后端高频知识点学习笔记1---Java基础
Java后端高频知识点学习笔记1---Java基础 参考地址:牛_客_网 https://www.nowcoder.com/discuss/819297 1.重载和重写的区别 重载:同一类中多个同名方 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- jQuery源代码学习笔记_工具函数_noop/error/now/trim
jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...
- Java超简明入门学习笔记(一)
Java编程思想第4版学习笔记(一) 第二章 一切都是对象(Hello World) 这个笔记本主要记录了我在学习Java编程思想(第4版,中文版)的过程中遇到的重难点及其分析.主要 ...
- 《Java编程思想》学习笔记(二)——类加载及执行顺序
<Java编程思想>学习笔记(二)--类加载及执行顺序 (这是很久之前写的,保存在印象笔记上,今天写在博客上.) 今天看Java编程思想,看到这样一道代码 //: OrderOfIniti ...
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
- Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
随机推荐
- iOS应用内支付(内购)的个人开发过程及坑!
本文会给大家详细介绍iOS内购,这是本人16年5月底的开发过程,希望对看完此篇文章的人有所帮助. 本文基于XcodeVersion 7.3 (7D175)版本,手机是iPhone 6,9.3系统. 部 ...
- yii自动登陆的验证机制浅析
一直在使用yii进行开发, 也知道如何去使用, 也仅仅是知道怎么去用罢了, 终归是没研究过源码, 心里发虚, 今天遇到一个问题, 关于自动登陆的问题. 要求就是, 修改登陆保存session天数为自定 ...
- josn 转php
$data = josn_decode(data,[true]); 加true转化为php数组:不加为对象,使用:$data->'字段'.
- 提升升级 强制更新 Download
Activity和广播 /** 下载APK细节 1.点击升级后对话框不消失,再次点击时不能重复下载 2.下载过程中退出APP,下次进入应用后要重新下载(因为可能不完整) 3.下载过程中退出APP(或下 ...
- HUD 2089 位数dp
/* 做的不多的位数dp 暴力的话 不知道多少组数据 会T 所以写dp 思路就和数学课本上那种“不超过xxx的x位偶数有几个” 这里可以类似的维护一个前缀和模样的东西(但又不同于前缀和) 状态:f[i ...
- jquery $('#btn').click与$("#btn").live("click",function()有什么区别?
live方法绑定的事件处理函数,在页面中未来添加的元素只要满足原来的选择器,仍然会导致事件触发.普通的事件绑定则没有这个效果.对于#btn这个选择器来说,如果你未来将id为btn的元素删除,然后再创建 ...
- 免写前缀JS包--prefixfree.min.js--插件
/** * StyleFix 1.0.3 & PrefixFree 1.0.7 * @author Lea Verou * MIT license */ (function(){functio ...
- Java实现文件上传
最近自己在做一个小系统玩的时候涉及到了文件的上传,于是在网上找到Java上传文件的方案,最后确定使用common-fileupload实现上传操作. 需求说明 用户添加页面有一个“上传”按钮,点击按钮 ...
- javascript判断值是否undefined
function isUndefined(variable) { return typeof variable == 'undefined' ? true : false; }
- Swift - 03 - 整数类型
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...