🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# java 中`ArrayList`和`Vector`之间的区别 > 原文: [https://beginnersbook.com/2013/12/difference-between-arraylist-and-vector-in-java/](https://beginnersbook.com/2013/12/difference-between-arraylist-and-vector-in-java/) [`ArrayList`](https://beginnersbook.com/2013/12/java-arraylist/)和[`Vector`](https://beginnersbook.com/2013/12/vector-in-java/) 都在内部使用数组作为数据结构。但是,它们存储和处理数据的方式几乎没有差异。在这篇文章中,我们将讨论`ArrayList`和`Vector`之间的差异和相似之处。 ## `ArrayList` Vs `Vector`: 1)**同步**:`ArrayList`是非同步的,这意味着多个线程可以同时在`ArrayList`上工作。对于例如如果一个线程正在对`ArrayList`执行添加操作,则可能有另一个线程在多线程环境中同时对`ArrayList`执行删除操作 `Vector`同步。这意味着如果一个线程正在处理`Vector`,则没有其他线程可以获取它。与`ArrayList`不同,一次只有一个线程可以对向量执行操作。 2)**调整大小:**`ArrayList`和`Vector`都可以动态增长和缩小以保持存储的最佳使用,但是它们调整大小的方式是不同的。调整大小时,`ArrayList`的大小增加一半,而增长时,`Vector`默认大小增加一倍。 3)**性能**:`ArrayList`提供更好的性能,因为它是非同步的。向量操作性能较差,因为它们是线程安全的,在`Vector`上工作的线程会对其进行锁定,这使得其他线程等待直到锁定被释放。 4)**快速失败**:首先让我解释什么是快速失败:如果集合(`ArrayList`,`vector`等)通过任何方式进行结构修改,除了**添加或删除方法**,在创建迭代器后,迭代器将抛出[`ConcurrentModificationException`](https://docs.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html)。结构修改是指从集合中添加或删除元素。 根据[`Vector` javadoc](https://docs.oracle.com/javase/7/docs/api/java/util/Vector.html "javadoc"),`Vector`返回的迭代器不是快速失败的。另一方面,`ArrayList`返回的`iterator`和`listIterator`是快速失​​败的。 5)**谁真的属于集合框架?** 该向量不是集合框架的一部分,它已被包含在集合中。它可以被视为旧版代码。`Vector`没有任何`List`集合不能做的内容。因此应避免使用`Vector`。如果需要线程安全操作,则使`ArrayList`同步,如本文下一节所述,或者使用[`CopyOnWriteArrayList`](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html),它是`ArrayList`的线程安全变体。 这些类之间的**相似性很少,如下所示:** 1. `Vector`和`ArrayList`都使用可扩展的数组数据结构。 2. 这些类(`Vector`和`ArrayList`)返回的迭代器和`listIterator`是快速失​​败的。 3. 它们都是有序的集合类,因为它们维护元素的插入顺序。 4. 向量和`ArrayList`都允许重复和空值。 5. 当溢出和删除发生时,它们会自动增长和缩小。 ### 何时使用`ArrayList`以及何时使用`Vector`? 这完全取决于要求。如果需要执行“线程安全”操作,则向量是最好的选择,因为它确保一次只有一个线程访问集合。 **性能:**同步操作比非同步操作消耗更多时间,因此如果不需要线程安全操作,`ArrayList`是更好的选择,因为并发进程会提高性能。 **如何使`ArrayList`同步?** 如上所述,`ArrayList`方法是非同步的,但如果有需要,你可以让它们像这样同步 - ```java //Use Collecions.synzhonizedList method List list = Collections.synchronizedList(new ArrayList()); ... //If you wanna use iterator on the synchronized list, use it //like this. It should be in synchronized block. synchronized (list) { Iterator iterator = list.iterator(); while (iterator.hasNext()) ... iterator.next(); ... } ``` #### 参考: * [`Vector`文档](https://docs.oracle.com/javase/6/docs/api/java/util/Vector.html) * [`ArrayList`文档](https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)