List集合中的对象按照一定的顺序排放,里面的内容可以重复。
实现List接口的类有
LinkedList(链表)、 ArrayList(动态数组)、Vector(动态数组)、Stack(堆栈)
一、LinkedList类(链表)
在上一个篇幅中已经提到LinkedList类是实现了Collection接口,所以它可使用所有Collection接口中声明的方法。
LinkedList类的数据结构是双向链表结构。它的每个结点不仅包含了值,还包括对上一个及下一个结点的引用,所以在进行数据的删除和插入时是高效的,但是在查询上是低效率的,这也是链表数据结构的普遍特点。
在程序需要采用整数索引访问元素时我们一般不用LinkedList类,因为其效率低下,但是即便如此Java还是提供了一个用来访问某个特定元素的get()方法。get()方法每次查找一个元素时都要从列表的头部开始重新搜素,如果索引大于size()/2时就从列表的尾部开始搜索。如果需要对集合进行随机访问就使用数组或者ArrayList。
java.util.List
1) ListIterator
2) ListIterator
3) void add(int i, E element); 在给定位置添加一个元素。
4) void addAll(int i, Collection extends E> elements);将某个列表的所有元素添加到此列表的指定位置。
5) E remove(int i); 删除给定位置的元素并且返回这个元素。
6) E get(itn i); 获取给定位置的元素。(数据结构比较复杂时不推荐使用)
7) E set(int i, E element); 用新元素取代指定位置的元素,返回原来那个元素。
8) int indexOf(Object element); 返回与指定元素相等的元素在列表中第一次出现的位置,如果没有这样的元素返回-1。
9) int lastIndexOf(Object element); 返回与指定元素相等的元素在列表最后一次出现的位置,如果没有这样的元素返回-1。
java.util.ListIterator
1) void add(E newElement); 在当前位置添加一个新元素。
2) void set(E newElement); 用新元素取代next或者previous上次访问的元素。如果在next或previous上次调用之后列表的结构被修改了,将抛出一个IllegalStateException异常。
3) boolean hasPrevious(); 当反向迭代列表时,还有可供访问的元素返回true。
4) E previous(); 返回前一个对象,如果已经到达了列表头部抛出NoSuchElementException异常。
5) int nextIndex(); 返回下一次调用next方法时将返回元素的索引。
6) int previousIndex(); 返回下一个调用previous方法时将返回元素的索引。
java.util.LinkedList
1) LinkedList(); 构造一个空链表。
2) LinkedList(Collection extends E> elements); 构造一个链表,请将集合中所有元素添加到这个链表中。
3) void addFirst(E element);
void addLast(E element);
将某个元素添加到列表的头部或者尾部。
4) E getFirst();
E getLast();
获取列表头部或者尾部的元素。
5) E removeFirst();
E removeLast();
删除并返回列表头部或者尾部的元素。
二、ArrayList(数组列表)
数组列表的优点就支持快速随机访问,但它的删除和新增性能效率低下,且下标越小时耗时越长,因为它要移动的元素越多。所以如果我们要经常对数据列表进行随进访问时推荐使用ArrayList而非LinkedList。
ArrayList实现了Collection接口的方法。
从类java.util.AbstractList继承的方法:equals、hashCode、iterator、listIterator。
从类java.util.AbstractCollection继承的方法:containsAll、removeAll、retainAll、toString。
具体用法和LinkedList中一样不再赘述。