【发布时间】:2010-09-22 23:10:55
【问题描述】:
Vector 和ArrayList 的性能真的有那么大的区别吗?在线程安全不是问题的情况下始终使用 ArrayList 是一种好习惯吗?
【问题讨论】:
标签: java performance collections
Vector 和ArrayList 的性能真的有那么大的区别吗?在线程安全不是问题的情况下始终使用 ArrayList 是一种好习惯吗?
【问题讨论】:
标签: java performance collections
如果线程安全不是问题,ArrayList 会更快,因为它不需要同步。不过,您应该始终将变量声明为 List,以便以后可以根据需要更改实现。
我更喜欢明确地处理我的同步,因为很多操作需要多次调用。例如:
if (!myList.isEmpty()) {
myList.get(0);
}
应该是:
synchronized (myList) {
if (!myList.isEmpty()) {
myList.get(0);
}
}
【讨论】:
Vector 起源于Collections API 之前的时代,并且已经被改造成为它的一部分。根据我的阅读,它不被弃用的原因是因为核心 API 依赖于它。
ArrayList 是作为 Collections API 的一部分从头开始编写的,因此应该使用它,除非您需要支持低至 1.2 的 Java 版本。
如果你需要一个线程安全的ArrayList,你可以使用静态工厂方法Collections.synchronizedList(new ArrayList<type>);来生成你的列表。
【讨论】:
如果线程安全不是问题,您应该始终使用ArrayList。 Vector 具有同步开销,并且已经证明ArrayList 和Vector 之间的性能差异非常大。你可以用谷歌搜索很多性能基准。
【讨论】:
忽略同步,Vector 和 ArrayList 之间的主要区别在于,Vector 是一个可调整大小的数组(类似于 C++ STL 向量),而ArrayList 是一个恰好由数组支持的 List。
区别体现在setSize() 方法中。 ArrayList 中没有等效的方法。一些前 C++ Java 开发人员对此束手无策。有许多简单方法可以解决它,所以这应该不是问题。
不要错误地告诉 C++ 开发人员 ArrayList 等同于 std::vector。你永远不会听到它的结束。
【讨论】:
Vector 和 ArrayList 之间最重要的区别是 Vector 是同步的,而 ArrayList 不是,这意味着所有在结构上修改 Vector 的方法,例如add () 或 remove () 是同步的,这使其成为线程安全的,并允许它在多线程和并发环境中安全使用。另一方面,ArrayList 方法不同步,因此不适合在多线程环境中使用。
ArrayList 比 Vector 快得多。由于 Vector 是同步的并且是线程安全的,因此它付出了同步的代价,这使得它有点慢。另一方面,ArrayList 不同步且速度不快,这使其成为单线程访问环境中的明显选择。
每当 Vector 超过指定的阈值时,它都会按照 capacityIncrement 字段中指定的值自行增加,而您可以通过调用 ensureCapacity() 方法来增加 ArrayList 的大小。
Vector 可以通过调用 elements() 方法返回它持有的项目的枚举,该方法与 Iterator 和 ArrayList 返回的 ListIterator 不同,它不是快速失败的。
值得记住的另一点是 Vector 是 JDK 1.0 附带的那些类之一,最初不是 Collection 框架的一部分,但在以后的版本中,它被重构为实现 List 接口,以便它可以成为集合框架的一部分
【讨论】: