ArrayList与Vector的区别

时间:2023-02-04 10:36:26

偶然间看到一道题目,关于ArrayListVector的区别。平时用的守候几乎都是ArrayList, 偶尔也会用到他们的转换, 只是知其然而不知其所以然, 一知半解之中。 难得有个机会总结一下他们的优缺点。一下主要是搜集网友的总结和评论,希望用到的时候可以参考下。

1) vector线程同步的,所以它也是线程安全的,而arraylist线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。

2) 如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,arraylist增长率为目前数组长度的50%.如果在集合中使用数据量比较大的数据,用vector有一定的优势。

3) 如果查找一个指定位置的数据vector和arraylist使用的时间是相同的,都是O(1),这个时候使用vector和arraylist都可以。

而如果移动一个指定位置的数据花费的时间为O(n-i)n为总长度,这个时候就应该考虑到使用linklist,因为它移动一个指定位置的数据所花费的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)

 

同步性
Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。

ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。

但是同步会影响执行的效率,所以如果你不需要线程安全的集合,那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销

 

数据增长
从内部实现机制来讲ArrayListVector都是使用数组(Array)来控制集合中的对象。

当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,

Vector缺省情况下自动增长原来一倍的数组长度,即100%

ArrayList是原来的50%,

所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,

因为你可以通过设置集合的初始化大小来避免不必要的资源开销。

 


使用模式
在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?因为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?
这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或
ArrayList都可以

如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的—O(1),但它在索引一个元素的使用时比较慢O(i),其中i是索引的位置.

使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。

LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。

 

其实也可以使用一个简单的数组(Array)来代替VectorArrayList。尤其是对于执行效率要求高的程序更应如此。

因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。

vector同步arraylist不同步
vector的容器是按原容器的2倍递增
arraylist的容器是按原容器的3/2倍+1递增的
所以arraylist占的内存小一点

 

 

1)《Thinking   in   Java》上很明确地说了:Vector是一个java1.0/1.1遗留的类,是为了与老代码兼容而保留的。有了ArrayList以后,应该尽量使用ArrayList而不是Vector。

2) 有人说,Vector可以同步,而ArrayList不能同步,是不对的。
正确的说法应该是:ArrayList(包括所有新一代的容器)可以选择性地使用同步,不需要时就不使用,而不是像Vector那样没有选择。

3) vector的同步是指方法上的同步,也就是说在他自己的方法里进行了同步,两个线程同时调用一个方法的时候不会出现问题,但如果一个线程里要想多次操作vector而且不想在这个过程中被其他线程打扰的话,仍然需要手动加锁来控制.

所以除了必须要写java1.0/1.1兼容的代码,否则完全可以不考虑Vector

4) 在多线程访问的时候需要用到同步,一般情况下不用考虑.而且ArrayList的出现就是用来取代vector,在同步的情况下,可以使用下面的方法来得到一个同步了的List

List   list   =   Collections.synchronizedList(new   ArrayList());

 

感觉ArrayList的使用率要比Vector高很多, 而且它还可以适当地利用同步, 同LinkList也是后起之秀, 有着不一般的效率