第 24 节 List集合

List接口

List子接口是Collection子接口中最为常用(80%)的一个子接口,其最大的特点是允许保存有重复元素数据,该接口的定义如下:

public interface List<E> extends Collection<E>

但是这个接口对Collection接口进行了一些功能的扩充。在List子接口里面重点掌握以下方法的使用:

No.
方法名称
类型
描述

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 内部实质上就是封装了一个双向链表的实现。

面试题:ArrayListLinkedList的区别?

  • ArrayList是数组实现的集合操作,LinkedList是链表实现的集合操作;

  • 使用get()方法获得数据时,ArrayList的时间复杂度为O(1)LinkedList的时间复杂度为O(n)

  • ArrayList在添加元素数量到一定界限时需要对数组容量进行扩容,LinkedList没有任何影响。

Vector

在最早JDK 1.0的时候就已经提供有Vector类,并且这个类被大量的使用。但是到了JDK 1.2的时候由于类集框架的引入,所以对于整个集合的操作就有了新的标准,那么为了可以继续保留下Vector类,所以让这个类多实现了一个List接口。

范例: 使用Vector

由于Vector的源码与ArrayList的源码大致相同,不再进行单独的分析。

**面试题:**请解释ArrayListVector的区别?

No.
区别
ArrayList(90%)
Vector(10%)

1

推出时间

JDK 1.2时推出,属于新的类

JDK 1.0时推出,属于旧的类

2

性能

采用异步处理

采用同步处理

3

数据安全

非线程安全

线程安全

4

输出

Iterator、ListIterator、foreach

Iterator、ListIterator、foreach、Enumeration

在以后的开发之中,如果使用了List子接口就使用ArrayList子接口。

最后更新于

这有帮助吗?