[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 行代码。

 1     public static void main(){
 2         List<String> list = new ArrayList<>();
 3         
 4         list.add("aa");
 5         list.add("bb");
 6     
 7         Iterator<String> iter = list.iterator();
 8         if (iter.hasNext()){
 9             System.out.println(iter.next());
10         }
11         
12         list.add("dd");
13         if (iter.hasNext()){
14             System.out.println(iter.next());
15         }
16     }

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

 

 

Jdk 版本: jdk1.8.0_31.jdk

 

posted @ 2016-07-08 01:08  TonyYPZhang  阅读(617)  评论(0编辑  收藏  举报