Java 集合 ArrayList和Vector之间的区别

ArrayListVector都在内部使用数组作为数据结构。但是,它们存储和处理数据的方式几乎没有差异。在这篇文章中,我们将讨论ArrayListVector之间的差异和相似之处。

ArrayList Vs Vector

1)同步ArrayList是非同步的,这意味着多个线程可以同时在ArrayList上工作。对于例如如果一个线程正在对ArrayList执行添加操作,则可能有另一个线程在多线程环境中同时对ArrayList执行删除操作

Vector同步。这意味着如果一个线程正在处理Vector,则没有其他线程可以获取它。与ArrayList不同,一次只有一个线程可以对向量执行操作。

2)调整大小:ArrayListVector都可以动态增长和缩小以保持存储的最佳使用,但是它们调整大小的方式是不同的。调整大小时,ArrayList的大小增加一半,而增长时,Vector默认大小增加一倍。

3)性能ArrayList提供更好的性能,因为它是非同步的。向量操作性能较差,因为它们是线程安全的,在Vector上工作的线程会对其进行锁定,这使得其他线程等待直到锁定被释放。

4)快速失败:首先让我解释什么是快速失败:如果集合(ArrayListvector等)通过任何方式进行结构修改,除了添加或删除方法,在创建迭代器后,迭代器将抛出ConcurrentModificationException。结构修改是指从集合中添加或删除元素。

根据Vector javadoc,Vector返回的迭代器不是快速失败的。另一方面,ArrayList返回的iteratorlistIterator是快速失​​败的。

5)谁真的属于集合框架? 该向量不是集合框架的一部分,它已被包含在集合中。它可以被视为旧版代码。Vector没有任何List集合不能做的内容。因此应避免使用Vector。如果需要线程安全操作,则使ArrayList同步,如本文下一节所述,或者使用CopyOnWriteArrayList,它是ArrayList的线程安全变体。

这些类之间的相似性很少,如下所示:

  1. VectorArrayList都使用可扩展的数组数据结构。
  2. 这些类(VectorArrayList)返回的迭代器和listIterator是快速失​​败的。
  3. 它们都是有序的集合类,因为它们维护元素的插入顺序。
  4. 向量和ArrayList都允许重复和空值。
  5. 当溢出和删除发生时,它们会自动增长和缩小。

何时使用ArrayList以及何时使用Vector

这完全取决于要求。如果需要执行“线程安全”操作,则向量是最好的选择,因为它确保一次只有一个线程访问集合。

性能:同步操作比非同步操作消耗更多时间,因此如果不需要线程安全操作,ArrayList是更好的选择,因为并发进程会提高性能。

如何使ArrayList同步?

如上所述,ArrayList方法是非同步的,但如果有需要,你可以让它们像这样同步 –

//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();
      ...
}
赞(0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

Java 集合