Vector和ArrayList也是面试过程经常提问到的Java基础知识,但是我们很多人容易忽略它们,这里总结一下他们的相同和不同,希望能提高和丰富一下我们的基础知识。
Vector和ArrayList都是基于储存元素的Object[] array数组来实现的,它们都是根据索引来访问元素。
以下将从二者的相同点和不同点进行讨论。
一、相同点
先说一下他们在查询,插入,删除对象的效率问题。ArrayList和Vector在从指定位置取得元素,从容器的末尾增加和删除元素都非常的有效,所有的这些操作都能在一个常数级的时间O(1)内完成,因为它们都是用数组实现的,我们知道数组在定位元素位置时非常的快,通过索引直接可以查到对应的元素位置。但是要在某个位置增加和删除一个元素时就显得颇为耗时,差不多需要的时间为O(n-i),这里的n代表元素个数,i代表要增加和删除的元素所在的位置。这些操作之所以要花费更多的时间,是因为你需要挨个移动i和更高位置的元素。
这意味着,如果你取得一个元素,或者从数组末尾增加或删除一个元素的话,随便你使用Vector或ArrayList,它们在效率上是相同的,可以说效率较高。但是,如果你想要对数组内容做其它操作的话,如插入元素,那么最好选择另外的容器。比如LinkedList,LinkedList可以在常数级时间(O1)内为任意一个位置的元素增加和删除,因为它是由链表实现的,对于插入元素非常的快,因为只需要改变一下指针指向即可,但它也有别的问题,就是查询元素会比较慢,因为它要依次轮询指针的指向,这时相对于ArrayList和Vector就要慢很多。
二、不同点
ArrayList与Vector的最大区别,主要包括两个方面:
1、同步性(synchronization):
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的数据结构,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。
所以基于以上,其实常用的还是ArrayList,只有在线程安全时才会去使用Vector。
2、数据增长:
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。
Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。
ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
总结:增加存储单元时,Vector一次增长原来的一倍,ArrayList增加原来的0.5倍。
参考:
http://blog.sina.com.cn/s/blog_8f99a1640101ohst.html
http://www.jobui.com/mianshiti/it/java/8149/