第 24 节 List集合
List接口
List子接口是Collection子接口中最为常用(80%)的一个子接口,其最大的特点是允许保存有重复元素数据,该接口的定义如下:
public interface List<E> extends Collection<E>
但是这个接口对Collection接口进行了一些功能的扩充。在List子接口里面重点掌握以下方法的使用:
1
public E get(int index)
普通
取得索引编号的内容
2
public E set(int index, E element)
普通
修改指定索引编号的内容
3
public ListIterator listIterator()
普通
为ListIterator接口实例化
而List本身是属于接口,所以如果要想使用此接口进行操作,那么就必须存在有子类,可以使用ArrayList子类实现操作(还有另一个Vector子类,90%的情况下选择的是ArrayList)。
ArrayList
ArrayList类是List接口最为常用的一个子类。下面将利用此类来验证之前所描述过的操作方法。

范例: List基本操作
可以发现,List集合之中所保存的数据是按照保存的顺序存放,而且允许存在有重复数据,但是List子接口扩充有get()方法。
范例: 为Collection接口实例化
ArrayList是List接口子类,而List有事Collection子接口,自然可以通过ArrayList为Collection接口实例化。
Collection接口与List接口相比,功能会显得有所不足,而且以上的形式并不是集合所使用的标准的输出的结构,只是一个基础的展示。
范例: 在集合里面保存对象
通过对 ArrayList 类名的理解就已经可以知道, ArrayList 内部封装着一个数组来保存所有的信息,为了深入了解 ArrayList 的内部结构,我们可以对其部分源码进行分析。
通过对源码进行分析可以看出, ArrayList 里面所包含的数据实际上就是一个对象数组。如果在进行数据追加的时候发现 ArrayList 集合里面保存的对象数组的长度不够的时候会进行新的数组开辟,同时将原始的旧内容拷贝到新数组中。、
如果在实例化 ArrayList 类对象的时候没有传入初始化的长度,则默认情况下会使用一个空数组,但是如果在进行追加元素的时候发现数据不够用了,则会判断当前的增长容量与默认的容量的大小,使用较大的一个进行数据的开辟,所以可以得出一个结论。
JDK1.9之前:
ArrayList默认的构造只会使用默认的空数组,使用的时候才会开辟数组,默认的开辟长度为10;JDK1.9之后:
ArrayList默认的构造实际上就会默认开辟大小为10的数组;
当 ArrayList 之中保存的容量不足的时候会扩展至原容量的1.5倍,所以在使用 ArrayList 的时候要估算出大概的存入数量,避免多次扩容产生较多的垃圾数组。
LinkedList
在 List 接口里面还有另一个比较常用的子类: LinkedList ,这个类与之前的 ArrayList 一样,通过名字就可以推断出其内部是基于链表的实现。

LinkedList 的操作与 ArrayList 完全一致,只是其内部的实现机制不同,下面通过分析 LinkedList 的部分源码来了解其内部机制。
可以发现 LinkedList 内部实质上就是封装了一个双向链表的实现。
面试题:ArrayList与LinkedList的区别?
ArrayList是数组实现的集合操作,LinkedList是链表实现的集合操作;使用
get()方法获得数据时,ArrayList的时间复杂度为O(1),LinkedList的时间复杂度为O(n);ArrayList在添加元素数量到一定界限时需要对数组容量进行扩容,LinkedList没有任何影响。
Vector
在最早JDK 1.0的时候就已经提供有Vector类,并且这个类被大量的使用。但是到了JDK 1.2的时候由于类集框架的引入,所以对于整个集合的操作就有了新的标准,那么为了可以继续保留下Vector类,所以让这个类多实现了一个List接口。

范例: 使用Vector
由于Vector的源码与ArrayList的源码大致相同,不再进行单独的分析。
**面试题:**请解释ArrayList与Vector的区别?
1
推出时间
JDK 1.2时推出,属于新的类
JDK 1.0时推出,属于旧的类
2
性能
采用异步处理
采用同步处理
3
数据安全
非线程安全
线程安全
4
输出
Iterator、ListIterator、foreach
Iterator、ListIterator、foreach、Enumeration
在以后的开发之中,如果使用了List子接口就使用ArrayList子接口。
最后更新于
这有帮助吗?