[Java] List / ArrayList - 源代码学习笔记
2016-07-08 01:08
489 查看
在阅读 List / ArrayList 源代码过程中,做了下面的笔记。 LinkedList 的笔记较多,放到了另一篇博文 LinkedList / Queue- 源代码学习笔记
1. 可以存在重复的元素。这点和 Set 是不一样的,Set 接口不允许重复的元素出现。
2. 有四个根据下标访问的方法 : get(int), set(int, E), add(int, E), remove(int).
3. 提供特殊的 Iterator —— ListIterator 。ListIterator 迭代器允许在遍历元素过程中插入元素、替换元素,以及双向遍历。ListIterator 特性用得少,一般使用 Iterator 足够。
4. toArray() 方法返回的是 List 元素的副本,对副本进行操作,不会影响原来的 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 行代码。
5. 声明实现了 RandomAccess 接口。RandomAccess 是一个标记接口,也就是没有任何成员方法、成员变量的声明,仅仅表示拥有随机访问的属性。随机访问有利于一些算法的性能优化。在泛型算法实现中,先通过 instanceof 来判断 List 是否有随机访问的属性,然后选择更合适的算法实现。
Jdk 版本: jdk1.8.0_31.jdk
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
相关文章推荐
- HDU 1753 大明A+B
- 切换eclipse package explorer字体大小
- Java容器的特点与接口中的方法
- The java.util.concurrent Synchronizer Framework
- java五子棋判断输赢算法
- java五子棋初实现
- java异步任务处理
- 用Java在网页上保存小说
- java模拟数组
- 表格嵌套—JavaWeb学习之路Day1
- struts2报错“Exception starting filter struts2 java.lang.NullPointerException”
- JavaEE学习笔记之Servlet/JSP(1)
- Java面向对象小项目 慕课网Java入门第二季答答租车系统
- Java 利用 ICC 色彩空间 color space profile 实现 RGB 和 CMYK 颜色的相互转换
- 基于java过滤器实现web系统的IP访问控制
- IDEA 2016在创建spring项目时遇到的坑
- Java创建文件且写入内容的方法
- Spring框架(jsonp调用乱码问题)
- java后台框架源码 springmvc mybatis
- spring事务的隔离级别和传播方式