java.util.List学习笔记
概述
在Java中,List是一种特殊的集合结构,即:List是一种有序的集合。在List接口的实现中,需要提供根据列表下表对元素进行操作的方法,包括:插入,删除,查询和修改等;
List一般允许重复的元素存在。判定元素是否相同的规则仍然为:e1.equals(e2)
。在用户实现接口的过程中 ,可以指定List是否允许重复元素。对于不允许重复元素的列表而言,在插入相同的元素时,推荐抛出一个运行时异常。但是Java中,并不推荐实现一个不允许重复的列表,因为这种类型更接近于java.util.Set
。
在List中,除了Collection中提供的接口外,还提供了List特定的接口,主要提供List根据下标进行访问服务。需要注意的一点是:根据下标进行列表中的元素访问的操作的执行时间可能与实现呈正相关关系。因此,在不清楚接口的具体实现时,建议使用迭代器进行列表中元素的定位访问操作。
在List中提供了一中特殊的迭代器,称为:列表迭代器。其除了常规迭代器的服务外,还提供插入、设值和双向访问操作。
一些列表的实现对于其中包含的元素有一定的限制。例如:一些列表不允许包含null元素,有的列表对其中元素的类型进行限制。当添加一个不满足限定条件的元素到列表中时,则抛出一个unchecked exception,通常为:NullPointerException
和ClassCastException
。
方法介绍
在本节中,将针对List中的特殊接口介绍,从Collection中继承的接口介绍见java.util.Collection学习笔记。
boolean addAll(int index, Collection<? extends E> c);
将集合c
中所有的元素插入到列表的指定位置(可选操作)。如果在指定位置后仍有元素,需要将指定位置后的所有元素向右进行顺移。集合c
中的元素在列表中位置与c
的迭代器返回元素的顺序相同。当在插入过程中,集合c
发生了改变,可能导致不可预期的结果,常见于将列表本身插入到列表中。
E get(int index);
返回列表中特定位置的元素。当不满足index < 0 || index >= size()
时,抛出IndexOutOfBoundsException
。
E set(int index, E element);
将列表中的特定位置的元素替换为element
(可选操作)。
void add(int index, E element);
在列表特定位置插入元素element
(可选操作)。需要将本位置后的所有元素向右平移一位。
E remove(int index);
删除列表特定位置的元素(可选操作)。将本位置后的所有元素左移一位,并返回被删除的元素。
int indexOf(Object o);
查找元素第一次在列表中的出现位置。如果列表中不包含该元素,则返回-1。即返回最小的满足条件(o==null ? get(i)==null : o.equals(get(i)))
的i
,如果没有,则返回-1。
int lastIndexOf(Object o);
查找元素最后一次在列表中的出现位置。如果列表中不包含该元素,则返回-1。即返回最大的满足条件(o==null ? get(i)==null : o.equals(get(i)))
的i
,如果没有,则返回-1。
ListIterator<E> listIterator();
获取一个可以双向访问列表元素的迭代器,包括:查询,修改和获取迭代器当前位置。列表迭代器的详细信息将在其它文章中介绍。
ListIterator<E> listIterator(int index);
获取一个从列表特定位置开始的,可以双向访问列表元素的迭代器。index
指定了第一次调用next()
方法应当返回的元素下标。而调用previous()
应当返回下标为index-1
的元素。
List<E> subList(int fromIndex, int toIndex);
返回当前列表的一个子视图,其由列表中fromIndex<=i<toIndex
的元素构成。当fromIndex==toIndex
时,则返回一个空列表。返回的子列表仍可以由原列表进行访问,即:子列表中对的非结构化修改会直接反映到原列表中,反之亦然。子列表支持原列表中所有的操作。这个方法消除了对列表提供特定范围操作方法的需求。因为任何一个对列表的操作均可以用作对列表一个特定范围子列表的操作。例如,list.subList(from, to).clear();
可以用于删除列表特定范围内的元素。并且Collection中所有的方法对一个子列表均适用。
如果该方法返回的列表在方法的执行过程中由于其它方法的调用导致了结构化的改变(即:列表的大小发生了改变,或者调用了影响迭代器返回结果的方法,如:将列表本身添加到列表中等),则会导致这个方法产生不可预期的结果。