Vector
和ArrayList
的效果真的有很大差异吗?当线程安全性不成问题时,始终使用ArrayLists是一种好习惯吗?
答案 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具有同步开销,并且已经证明ArrayList
和Vector
之间的性能差异非常糟糕。你可以谷歌搜索很多性能基准测试。
这是一个Timing & Performance。
答案 3 :(得分:5)
忽略同步,Vector
和ArrayList
之间的主要区别在于Vector
是一个可调整大小的数组(类似于C ++ STL Vector),而ArrayList
是一个List恰好由数组支持。
差异在setSize()方法中体现出来。 ArrayList
中没有等效方法。一些前C ++ Java开发人员对此持怀疑态度。有很多 easy 方法可以解决它,因此它不应该是一个问题。
不要错误地告诉C ++开发人员ArrayList
等同于std::vector
。你永远不会听到它的结束。
答案 4 :(得分:3)
Vector和ArrayList之间的第一个也是最重要的区别是Vector是同步的而ArrayList不是,它的意思是所有结构修改Vector的方法,例如add ()
或remove ()
已同步,这使其具有线程安全性,并允许在多线程和并发环境中安全地使用它。另一方面,ArrayList方法不同步,因此不适合在多线程环境中使用。
ArrayList比Vector快。由于Vector是同步的并且是线程安全的,因此它需要付出同步代价,这使得它很慢。另一方面,ArrayList没有同步和快速,这使其成为单线程访问环境中的明显选择。
每当Vector超过指定的阈值时,它会自动增加capacityIncrement字段中指定的值,而您可以通过调用ensureCapacity()
方法来增加ArrayList的大小。
Vector可以通过调用elements()
方法返回其所持项目的枚举,该方法不是快速失败,而不是Iterator和ListIterator
返回的ArrayList
。
值得记住的另一点是Vector是JDK 1.0附带的那些类之一,并且最初不是Collection框架的一部分,但是在后来的版本中,它被重新考虑实现List接口,以便它可以成为集合框架的一部分< / p>