如果线程安全性不是问题,则使用Java中的ArrayList与Vectors

时间:2008-11-18 23:17:50

标签: java performance collections

VectorArrayList的效果真的有很大差异吗?当线程安全性不成问题时,始终使用ArrayLists是一种好习惯吗?

5 个答案:

答案 0 :(得分:40)

Vector源于预收集API时代,并且自从成为其中的一部分后进行了改造。从我所读到的,它不被弃用的原因是因为核心API依赖于它。

ArrayList是作为Collections API的一部分从头开始编写的,因此除非您需要支持低至1.2的Java版本,否则应该使用它。

如果您需要线程安全的ArrayList,可以使用静态工厂方法Collections.synchronizedList(new ArrayList<type>);生成列表。

答案 1 :(得分:15)

如果线程安全不是问题,ArrayList将更快,因为它不必同步。虽然,您应该始终将变量声明为List,以便稍后可以根据需要更改实现。

我更喜欢明确处理我的同步,因为很多操作需要多次调用。例如:

if (!myList.isEmpty()) { 
    myList.get(0);
}

应该是:

synchronized (myList) {
   if (!myList.isEmpty()) { 
       myList.get(0);
   }
}

答案 2 :(得分:9)

如果线程安全不是问题,则应始终使用ArrayList。 Vector具有同步开销,并且已经证明ArrayListVector之间的性能差异非常糟糕。你可以谷歌搜索很多性能基准测试。

这是一个Timing & Performance

答案 3 :(得分:5)

忽略同步,VectorArrayList之间的主要区别在于Vector是一个可调整大小的数组(类似于C ++ STL Vector),而ArrayList是一个List恰好由数组支持。

差异在setSize()方法中体现出来。 ArrayList中没有等效方法。一些前C ++ Java开发人员对此持怀疑态度。有很多 easy 方法可以解决它,因此它不应该是一个问题。

不要错误地告诉C ++开发人员ArrayList等同于std::vector。你永远不会听到它的结束。

答案 4 :(得分:3)

ArrayList与Vectors

1。同步和线程安全

Vector和ArrayList之间的第一个也是最重要的区别是Vector是同步的而ArrayList不是,它的意思是所有结构修改Vector的方法,例如add ()remove ()已同步,这使其具有线程安全性,并允许在多线程和并发环境中安全地使用它。另一方面,ArrayList方法不同步,因此不适合在多线程环境中使用。

2。速度和性能

ArrayList比Vector快。由于Vector是同步的并且是线程安全的,因此它需要付出同步代价,这使得它很慢。另一方面,ArrayList没有同步和快速,这使其成为单线程访问环境中的明显选择。

3。容量

每当Vector超过指定的阈值时,它会自动增加capacityIncrement字段中指定的值,而您可以通过调用ensureCapacity()方法来增加ArrayList的大小。

4。枚举和迭代器

Vector可以通过调用elements()方法返回其所持项目的枚举,该方法不是快速失败,而不是Iterator和ListIterator返回的ArrayList

5。遗留

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