面试知识点--Vector和ArrayList的比较

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/

对以上博文的作者表示感谢。
这里写图片描述
欢迎您扫一扫上面的微信公众号,订阅我的个人公众号!
本公众号将以推送Android各种碎片化小知识或小技巧,以及整理Android面试知识点为主,也会不定期将开发老司机日常工作中踩过的坑,平时自学的一些知识总结出来进行分享。每天一点干货小知识把你的碎片时间充分利用起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值