List(JDK1.7)(1)

java.util包.imagejava

与Set不一样, List容许重复的元素。即 e1.equals(e2)。数组

部分方法定义

  • int size();

返回列表中元素的个数,若是超过Integer.MAX_VALUE,就返回Integer.MAX_VALUE安全

  • boolean isEmpty();
  • boolean contains(Object o);

对于目标元素o, 若是列表中至少存在一个元素e:o==null? e==null ; o.eqauls(e)。多线程

若是目标元素不可比较,将会抛出异常:ClassCastException.线程

若是目标元素为null,而且该列表不容许null元素,则抛出异常:NullPointerException.3d

  • Iterator<E> iterator();
  • Object[] toArray();

以恰当的顺序返回列表中的全部元素。对象

返回的数组是安全的,由于它的引用不是由该列表维护的。也就是说,该方法必须申请一个新的数组,即便list自己就是基于数组的。所以,调用者能够自由地修改返回的数组。blog

该方法做为一个桥梁,创建起基于数组和基于集合的API。继承

  • <T> T[] toArray(T[] a);

返回数组的运行时类型是指定的数组类型。接口

若是列表刚好是该类型的,就会直接返回。不然,必须申请一个新数组,新数组的大小刚好就是列表的size。

若是列表是指定类型的,而且数组中还有剩余空间,则未使用的数组位置所有置null。——这一点颇有用,由于能够判断列表的长度。前提是调用者知道该list不会包含任何null元素。

  • boolean add(E e);

支持该操做的List,可能会限制容许加入该list的元素。好比,有些list可能会拒绝添加null做为元素,而其余list有可能限制元素的类型。

UnsupportedOperationException, 若是该List不支持add方法。

ClassCastException, 指定元素的类class,不容许它被添加到该list中。

NullPointerException,若是指定元素是null,而且该List不容许null元素。

IllegalArgumentException,若是该元素的某些属性,不容许它被添加到该list中。

  • boolean remove(Object o);

删除第一次出现的那个元素,即下标最小的: o==null ? get(i )==null : o.eqauls(get(i );

若是列表中不包含这样的元素,就不变。

ClassCastException,若是指定元素的类型没法与list匹配。

NullPointerException, 若是指定元素是null,而且list不容许null元素。

UnsupportedOperationException,list不支持remove方法。

  • boolean containsAll(Collection<?> c);

若是列表中包含了指定collection中的全部元素,返回true。

ClassCastException,若是指定collection中的一个或多个元素的类型与该list不匹配

NullPointerException,指定collection中包含一个或多个null,而list不容许null元素。

  • boolean addAll(Collection<? extends E> c);

UnsupportedOperationException

ClassCastException

NullPointerException

IllegalArgumentException

  • boolean addAll(int index, Collection<? extends E> c);

在指定的下标处插入指定collection中的全部元素。

IndexOutOfBoundsException,若是下标超出范围。

  • boolean removeAll(Collection<?> c);

删除list中全部在c中出现的元素。

  • boolean retainAll(Collection<?> c);

保留指定集合中出现的全部元素。

NullPointerException, 若是list中包含一个null,而指定的collection是不容许null的时候。

ClassCastException

  • void clear();
  • boolean equals(Object o);

两个list相等的条件是:他们包含相同的元素,以相同的顺序。

  • int hashCode();

image

  • E get(int index);
  • E set(int index, E element); //替换已有下标处的元素
  • void add(int index, E element);
  • E remove(int index);
  • int indexOf(Object o);

若是存在,就返回第一次出现的下标。若是不存在,返回-1.

  • int lastIndexOf(Object o);
  • ListIterator<E> listIterator();
  • ListIterator<E> listIterator(int index); //从指定的下标开始遍历
  • List<E> subList(int fromIndex, int toIndex);

返回一个视图。包含左下标,不包含右下标。

返回的List是基于原list的,因此在返回的list中进行的非结构性修改会在原list中体现,反之亦然。

任何针对局部范围list的操做,均可以经过传递一个subList视图来表明整个list。例如,下列语句删除了list中的部分元素:

list.subList(from, to).clear();

ArrayList

List接口的一种可调整大小的基于数组的实现。实现了全部可选的list操做,也容许全部元素,包括null。

另外,该类还提供了操纵底层实现数组的大小的方法。

该类和Vector类基本是同样的,除了ArrayList是非同步的。

以常数时间运行的方法:size, isEmpty, get, set, iterator, listIterator。摊销的常数时间,即O(n ):add。粗略来讲,其余方法的运行时间都是线性的。常数因子比起LinkedList要小。

每一个ArrayList的实例都有一个容量capacity。这是底层数组的大小。一般,容量至少要和List的大小同样大。由于增长一个元素有常数的摊销时间,因此没有明确规定增加策略的细节。

在增长大量元素以前扩容的一个办法是使用ensureCapacity操做,这能够减小容量调整的次数。

注意ArrayList是非同步的。若是多线程同时访问同一个ArrayList实例,而且至少有一个线程修改了列表结构,就必需要有外部的同步机制。一般经过同步某些封装了该list的对象来实现,若是没有这样的对象,该list就应该使用Collections.synchronizedList()来包装。最好在建立时就这样作,能够避免对该list的意外的非同步访问。(结构性修改是指,增长或删除一个或多个元素,或者调整了底层数组的大小,只修改了元素的值不是结构性修改)。

ArrayList中的iterator()方法和listIterator()返回的迭代器都是快速失败的。若是在建立了该迭代器以后的任意时间对list进行告终构性修改,除了经过iterator自己提供的方法以外,该Iterator都会抛出一个ConcurrentModificationException异常。面对同时发生的修改,iterator会快速干脆地失败,而不是没法肯定将来的冒险的、非肯定性的行为。

注意,iterator提供的快速失败机制并不能保证线程安全。快速失败机制应该只用于检测bug。

AbstractList源码

抽象类实现了部分方法。

image

 

ArrayList源码细节

ArrayList继承自AbstractList抽象类。

成员变量

image

 

构造方法

image

 

get()方法

image

image

image

 

set()方法

image

 

add()方法

image

image

 

扩容

image

 

contains()方法

image

 

remove()方法

image

 

clear()方法

image

 

clone()方法

image

 

转换为数组

image

 

迭代器 iterator 和 listIterator

image

image

image

image

【关于Itr中的remove()方法】

注意到lastRet表示上一次读取的位置,当这个位置为-1时,remove方法抛出IllegalStateException。而这个位置 为-1的状况,一个是初始化时,还未调用过next(),另外一个是在调用了remove()方法后。因此,在这两种状况下是不能调用remove()方法的,即remove()方法不能连续调用,必须和next()结合,先next()后remove()。

另外,在删除元素时,会同步更新iterator中的expectedModCount,这样保持和List中的modCount的一致,从而使得checkForComodification()检测经过,本质上并非线程同步的,当多个Iterator同时访问同一个List时,仍然是不安全的。

image

image

【ListItr】

在Itr的基础上,增长了向前遍历的方法,至关于一个双向遍历器。还增长了set()和add()方法,使得遍历器不只能够删除元素,还能够修改和增长元素。

特别注意的,add()方法和remove()方法都会修改lastRet值为-1,所以须要读取lastRet的方法,譬如set(),remove()都不能在这两个方法后面调用,须要先调用一次next()方法。

List的add()和remove()方法都是结构性的修改,因此迭代器中的add()和remove()方法须要同步更新modCount的值,不然会在下一次增删改查操做时,检测到不相同,而抛出ConcurrentModificationException。

 

子列表视图

image

image

image

相关文章
相关标签/搜索