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