Collection子接口之List

List接口作为Collection的子接口之一,它用来存储有序的、可重复的元素。List的主要实现类有:ArrayList、LinkedList以及vector。

常用方法

List接口额外声明了一些常用的方法。

Modifier and Type Method Description
void add(int index, E element) Inserts the specified element at the specified position in this list (optional operation).
boolean addAll(int index, Collection<? extends E> c) Inserts all of the elements in the specified collection into this list at the specified position (optional operation).
E get(int index) Returns the element at the specified position in this list.
E set(int index, E element) Replaces the element at the specified position in this list with the specified element (optional operation).
int indexOf(Object o) Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.
static <E> List<E> of() Returns an immutable list containing zero elements.
static <E> List<E> of(E e1) Returns an immutable list containing one element.
static <E> List<E> of(E... elements) Returns an immutable list containing an arbitrary number of elements.
E remove(int index) Removes the element at the specified position in this list (optional operation).
default void replaceAll(UnaryOperator<E> operator) Replaces each element of this list with the result of applying the operator to that element.
default Spliterator<E> spliterator() Creates a Spliterator over the elements in this collection.
default Stream<E> stream() Returns a sequential Stream with this collection as its source.
List<E> subList(int fromIndex, int toIndex) Returns a view of the portion of this list between the specified fromIndex, inclusive, and toIndex, exclusive.

ArrayList、LinkedList、Vector之间的对比

ArrayList与Vector

先看ArrayList与Vector。它们两的相同点:都是使用数组Object[] elementData存放数据。

Vector作为古老实现类(List接口不存在时它就存在了),缺点非常明显。它的方法都是采用线程安全的,所以导致效率低下。所以,才新造了ArrayList实现类,用来取代Vector(决定同步与否应让开发者自己决定)。目前ArrayList的开发中使用率在所有的实现类中是最高的。而Vector,则基本不会使用了。

这里再多说几句,如果已经知道或能够估计出数组可能存储的元素数量,就可以在填充之前使用ensureCapacity方法:

staff.ensureCapacity(100);

这个方法调用将分配一个包含一个100个对象的内部数组。这样一来,前100次调用add不会带来开销很大的重新分配空间。

更简单的方法是在声明的时候指定

ArrayList<Employee> staff = new ArrayList<Employee> (100);

ArrayList与LinkedList

比较完ArrayL和Vector后,再看看ArrayList和LinkedList之间有哪些不同之处。它们之前的不同是由于底层数据结构决定的,ArrayList是使用数组存储元素的,而LinkedList则使用双向链表结构来存储元素。

操作 ArrayList LinkedList
获取指定元素 速度很快 需要从头开始查找元素
添加元素到末尾 速度很快 速度很快
在指定位置添加/删除 需要移动元素(慢) 不需要移动元素(快)
内存占用 较大

对比完后给出一个结论:对于频繁的插入、删除操作,使用LinkedList,否则使用ArrayList