List接口一共又三个实现类,ArrayList,Vector和LinkedList
它们的区别以及相同点:
相同点:都能添加Object类型的的集合,它们对数据的存放形式仿造于数组,属于集合类
ArrayList和Vector 两者都是基于索引的,内部由一个数组支持,都允许 null 值,也可以使用索引值对元素进行随机访问。如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,都是0(1),这个时候使用vector和arraylist都可以
不同点:
1、同步性:
ArrayList,LinkedList是不同步的,但Vestor是的。所以如果要求线程安全的话,可以使用ArrayList或LinkedList,可以节省为同步而耗费开销。但在多线程的情况下,避免多线程同时写而引起的不一致性,不得不使用Vector了,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。当然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。
So,ArrayList在迭代的时候对列表进行改变吗,应该使用 CopyOnWriteArrayList,否则会报错。ConcurrentModificationException异常,不允许并发修改。
2、容量扩充性
从内部实现机制来讲ArrayList和Vector都是使用Objec的数组形式来存储的。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
3、数据操作效率
ArrayList和Vector中,从指定的位置(用index)检索一个对象,或在集合的末尾插入、删除一个对象的时间是一样的,可表示为O(1)。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行(n-i)个对象的位移操作。LinkedList中,在插入、删除集合中任何位置的元素所花费的时间都是一样的-O(1),但它在索引一个元素的时候比较慢,为O(i),其中i是索引的位置
List集合 的 ArrayList & LinkedList & Vector
原文:https://www.cnblogs.com/6000L/p/14772757.html