您的位置:首页 > 职场人生

Java集合面试题(01) Java中ArrayList和Vector之间的区别

2017-11-21 10:18 639 查看

译文

     ArrayList和Vector是Java集合包中最常用的两个类,Vector和ArrayList之间的区别是第一轮或电话面试中最常见的Java面试问题之一。虽然在我看来这是一个相当简单的问题,但是知道什么时候使用Vector而非ArrayList,或者如果你正在处理一个项目,这个问题很重要。在本文中,我们将介绍Java中Vector和ArrayList之间的一些区别,并试图理解这些差异背后的概念。最终目标是熟悉ArrayList和Vector的差异。顺便说一下,Java 5增加了另一个类似于Vector和ArrayList的List接口的实现,但是提供了比Vector更好的并发访问,其被称为CopyOnWriteArrayList。顺便提一下,这是关于收集面试问题的第三篇文章,LinkedList和ArrayList之间的区别以及List
vs Set是基于Java中的集合框架的其他受欢迎的面试问题。

    在看到Vector和ArrayList之间的差异之前,让我们看看这两者之间的一些相似之处,以及为什么我们可以在某些场景下使用ArrayList来代替Vector。

    1) Vector和ArrayList是基于索引的,并由内部数组进行备份。

    2) ArrayList和Vector都维护元素的插入顺序。意思是你可以假设如果你迭代ArrayList或Vector,你将按照你插入的顺序获得对象,

    3) ArrayList和Vector返回的Iterator和ListIterator都是快速失败的。

    4) ArrayList和Vector也允许null和重复。

    Java中的Vector与ArrayList

    现在我们来看看Java中的Vector和ArrayList之间的一些关键区别,这将决定什么时候使用Vector而非ArrayList,反之亦然。差异是基于同步,线程安全,速度,性能,访问和迭代列表等属性。

    1)同步和线程安全

    Vector和ArrayList之间的首要区别在于Vector是同步的而ArrayList不是,意思是所有结构上修改Vector的方法,例如add()或remove()是同步的,这使得它是线程安全的并且允许它在多线程和并发环境中安全地使用。另一方面ArrayList方法不同步,因此不适合在多线程环境中使用。这也是线程上的一个受欢迎的面试问题,人们问为什么ArrayList不能在多个线程之间共享。

    2)速度和性能

    ArrayList比Vector更快。由于Vector是同步的并且是线程安全的,所以它支付同步的代价,这使得它不那么慢。另一方面ArrayLi
bdaa
st不是同步和快速的,这使得它在单线程访问环境中显而易见。如果多个线程只从ArrayList读取值,或者您也可以创建只读ArrayList,那么也可以在多线程环境中使用ArrayList。

    3)容量

    只要Vector超过指定的阈值,它就会通过capacityIncrement字段中指定的值增加自身容量,而通过调用ensureCapacity()方法可以增加ArrayList的大小。

    4)枚举和迭代器

    Vector可以通过调用不是快速失败的elements()方法返回它所保存的项的枚举,而不是由ArrayList返回的Iterator和ListIterator。我已经在我的帖子中详细讨论了这一点,Iterator和Enumeration之间有什么区别,你也可以看看那里。

    5)遗产

    另一点值得记住的是Vector是JDK 1.0附带的类之一,最初不是Collection框架的一部分,但在后来的版本中,它被重新考虑实现List接口,以便它可以成为集合框架的一部分

   

    在考虑了关于Vector和ArrayList的这些观点之后,我的结论是尽可能地使用ArrayList,并避免使用Vector,直到你没有选择。如果您有多个阅读器和少量编写器,则可以考虑使用Vector上的CopyOnWriteArrayList,因为它可以在不影响性能的情况下提供线程安全性。

 原文链接

http://javarevisited.blogspot.sg/2011/09/difference-vector-vs-arraylist-in-java.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: