Java中的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能够为您的程序量身定做需要的集合。