欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中的Vector和ArrayList区别及比较

程序员文章站 2024-03-04 08:01:35
vector  和  arraylist 比较 有时用vector更好一点,有时用arraylist更好一点,不能准确容易的给出答案,因为要视具体情况...

vector  和  arraylist 比较

有时用vector更好一点,有时用arraylist更好一点,不能准确容易的给出答案,因为要视具体情况而定,有四个主要考虑的因素:

1:api
2: 同步(synchronization)
3:数据增长(data  growth)
4:使用模式(usage  pattern)

下面分别意义探讨:

1:api

在ken arnold, james gosling, and david holmes 的 java 程序语言的描述中,vector和arraylist是类比设计的,从api 的角度来看,两个类有很多相似性,但是两个类也有一些不同。

2:同步(synchronization)

从同步性的角度考虑 :  vector是同步的,一些访问vector的内容的方法是线程安全的,而arraylist是非同步的,访问arraylist的内容的方法是线程不安全的,因为有这个不同,使用synchronized关键字修饰的,将会在性能上有所下降,因此如果你不需要一个线程安全的集合,使用arraylist。不用花费不必要的synchronization性能开销。

3:数据增长(data   growth)

从内部的数据结构来看,arraylist 和 vector都是使用  数组(array)的模式存放内容,你需要在程序设计中小心这个本质,当在 arraylist和 vector中插入数据时,如果arraylist或 vector的对象存储超出了对应的空间(即内部数组长度)。对应的arraylist或 vector将会扩充它们的内部的数组。 vector默认扩充内部数组的一倍,就是相当于两个以前的数组的大小,而arraylist仅仅增加50%的大小,根据你使用哪个类来确定增加一个元素的性能影响,最好的方式就是设置对象的初始化容量为需要的最大容量,这样能够避免以后插入元素后的自增长,(自增长会涉及到数组内部元素的复制到新创建的数组中),如果你不知道数据将增长到多大,但是你知道数据增长的速率,vectory能够拥有轻微的优势,因为你能够设置增长的值。

至于为什么要把 vector设置为同步和自增长为自身大小的一倍而arraylist设置为非同步自增长为自身大小的一半:

八卦一下:设置为同步说明数据增长比较激烈,就是增长速率和频率较大,如果设置为一半,很快数组又满了,所以设置为一倍。

而arraylist相应的 增长速率慢,设置为不同步,不容易出现多线程并发问题。
八卦只是个人理解,欢迎拍砖。

4:使用模式(usage pattern)

arraylist和vector都是比较好的在检索特定位置 的元素的时候以及在集合的末尾增加和移除元素,所有以上的操作都是在o(1)的线性时间,但是如果增加和移除一些别的位置的元素(非最末尾位置)需要更昂贵的线性时间开销为o(n-i),n代表了元素的总个数,i代表了插入或移除的索引位置,这些操作代价更大,因为不得不移动索引i后端所有的元素,这意味着什么呢?

这意味着你先查找到索引为以及 i 以后 的元素,然后在数组的末尾插入和移除该元素。如果你想做插入或删除,可以考虑一些别的集合类,例如:linkedlist能够增加或移除一些位置的元素在常量时间o(1)内,但是索引元素的位置比较慢,需要o(i)的时间开销,i 是需要的元素的索引,遍历arraylist是很容易的,因为你能够简单的使用索引代替创建一个迭代器,linkedlist也为每一个插入的元素创建一个内部的对象,因此你必须意识到额外的垃圾被创建。

最后声明:你能够使用最普通的数组来代替vector或者arraylist,尤其是因为标准代码的性能,使用数组能够避免同步(synchronization),额外的方法调用,最适度的调整大小,你仅仅需要花费额外的开发时间。通过array能够为您的程序量身定做需要的集合。