码迷,mamicode.com
首页 > 编程语言 > 详细

[Java] List / ArrayList 源代码学习笔记

时间:2016-07-08 01:38:39      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

在阅读 List / ArrayList 源代码过程中,做了下面的笔记。 LinkedList 待更新.

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 是否有随机访问的属性,然后选择更合适的算法实现。

 

[Java] List / ArrayList 源代码学习笔记

标签:

原文地址:http://www.cnblogs.com/TonyYPZhang/p/5652062.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!