与Set不一样, List容许重复的元素。即 e1.equals(e2)。数组
返回列表中元素的个数,若是超过Integer.MAX_VALUE,就返回Integer.MAX_VALUE安全
对于目标元素o, 若是列表中至少存在一个元素e:o==null? e==null ; o.eqauls(e)。多线程
若是目标元素不可比较,将会抛出异常:ClassCastException.线程
若是目标元素为null,而且该列表不容许null元素,则抛出异常:NullPointerException.3d
以恰当的顺序返回列表中的全部元素。对象
返回的数组是安全的,由于它的引用不是由该列表维护的。也就是说,该方法必须申请一个新的数组,即便list自己就是基于数组的。所以,调用者能够自由地修改返回的数组。blog
该方法做为一个桥梁,创建起基于数组和基于集合的API。继承
返回数组的运行时类型是指定的数组类型。接口
若是列表刚好是该类型的,就会直接返回。不然,必须申请一个新数组,新数组的大小刚好就是列表的size。
若是列表是指定类型的,而且数组中还有剩余空间,则未使用的数组位置所有置null。——这一点颇有用,由于能够判断列表的长度。前提是调用者知道该list不会包含任何null元素。
支持该操做的List,可能会限制容许加入该list的元素。好比,有些list可能会拒绝添加null做为元素,而其余list有可能限制元素的类型。
UnsupportedOperationException, 若是该List不支持add方法。
ClassCastException, 指定元素的类class,不容许它被添加到该list中。
NullPointerException,若是指定元素是null,而且该List不容许null元素。
IllegalArgumentException,若是该元素的某些属性,不容许它被添加到该list中。
删除第一次出现的那个元素,即下标最小的: o==null ? get(i )==null : o.eqauls(get(i );
若是列表中不包含这样的元素,就不变。
ClassCastException,若是指定元素的类型没法与list匹配。
NullPointerException, 若是指定元素是null,而且list不容许null元素。
UnsupportedOperationException,list不支持remove方法。
若是列表中包含了指定collection中的全部元素,返回true。
ClassCastException,若是指定collection中的一个或多个元素的类型与该list不匹配
NullPointerException,指定collection中包含一个或多个null,而list不容许null元素。
UnsupportedOperationException
ClassCastException
NullPointerException
IllegalArgumentException
在指定的下标处插入指定collection中的全部元素。
IndexOutOfBoundsException,若是下标超出范围。
删除list中全部在c中出现的元素。
保留指定集合中出现的全部元素。
NullPointerException, 若是list中包含一个null,而指定的collection是不容许null的时候。
ClassCastException
两个list相等的条件是:他们包含相同的元素,以相同的顺序。
若是存在,就返回第一次出现的下标。若是不存在,返回-1.
返回一个视图。包含左下标,不包含右下标。
返回的List是基于原list的,因此在返回的list中进行的非结构性修改会在原list中体现,反之亦然。
任何针对局部范围list的操做,均可以经过传递一个subList视图来表明整个list。例如,下列语句删除了list中的部分元素:
list.subList(from, to).clear();
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。
抽象类实现了部分方法。
ArrayList继承自AbstractList抽象类。
注意到lastRet表示上一次读取的位置,当这个位置为-1时,remove方法抛出IllegalStateException。而这个位置 为-1的状况,一个是初始化时,还未调用过next(),另外一个是在调用了remove()方法后。因此,在这两种状况下是不能调用remove()方法的,即remove()方法不能连续调用,必须和next()结合,先next()后remove()。
另外,在删除元素时,会同步更新iterator中的expectedModCount,这样保持和List中的modCount的一致,从而使得checkForComodification()检测经过,本质上并非线程同步的,当多个Iterator同时访问同一个List时,仍然是不安全的。
在Itr的基础上,增长了向前遍历的方法,至关于一个双向遍历器。还增长了set()和add()方法,使得遍历器不只能够删除元素,还能够修改和增长元素。
特别注意的,add()方法和remove()方法都会修改lastRet值为-1,所以须要读取lastRet的方法,譬如set(),remove()都不能在这两个方法后面调用,须要先调用一次next()方法。
List的add()和remove()方法都是结构性的修改,因此迭代器中的add()和remove()方法须要同步更新modCount的值,不然会在下一次增删改查操做时,检测到不相同,而抛出ConcurrentModificationException。