1

首先,我应该说,在我的书(2005 年)中,Vector<E>它(广泛使用)代替了数组。同时也没有解释两者之间的差异。检查Oracle DocVector类很容易理解它的用法。

对 StackOverflow 和 Google 进行了一些额外的研究,我发现Vector该类实际上已被弃用并改为使用ArrayList这是正确的吗? 我还找到了有关 Array 和 ArrayList 之间差异的广泛解释。

我无法真正理解的部分:是否有关于我应该在哪里使用ArrayList而不是简单数组的规则?看来我应该总是使用ArrayList. 它看起来更高效,并且应该更容易实现值/对象的集合,这种方法有什么缺点吗?

4

4 回答 4

4

一些历史:

  • Vector从 Java 1.0 开始存在;
  • List接口自 Java 1.2 以来就存在,因此也存在ArrayList
  • Vector同时进行了改造以实现List接口;
  • 引入泛型的 Java 5 已于 2004 年推出(链接)。

你的课程,可以追溯到 2005 年,应该ArrayList在列表中就有知识(抱歉,至少),并且应该也引入了泛型。

至于Array,有java.lang.reflect.Array,它有助于对数组进行反射(即int[],等)。

基本上:

  • Vector同步所有操作,这在 90+% 的情况下是一种浪费;
  • 如果你想要并发集合,Java 5 已经引入ConcurrentHashMap等等CopyOnWriteArrayList,你应该使用那些;
  • Vector在任何情况下都不要再使用;JDK 中的一些代码仍然使用它,但这是出于向后兼容性的原因。在新代码中,有更好的替代方案,如上一点所述;
  • 从 Java 1.2 开始,Vector不再提供与过去提供的相同的线程安全保证。

后一点很有趣。之前IteratorEnumeration,并且Enumeration没有提供删除元素的可能性;Iterator,但是,确实如此。

因此,让我们取两个线程t1t2,a ,以及在该向量Vector上具有 a 的那两个线程。Iterator线程t1做:

while (it.hasNext())
    it.next();

线程t2做:

// remember: different iterator
if (!it.hasNext())
    it.remove();

由于一些不幸的时机,你有:

t1                  t2
------              ------
hasNext(): true
                    .hasNext(): false
                    removes last element
.next() --> BOOM

因此,Vector实际上不是线程安全的。自从 Java 5 引入“foreach 循环”以来,它的线程安全性甚至更低,它创建了一个“隐藏”迭代器。

于 2013-07-13T19:03:13.513 回答
3

arrayan和 an之间的基本区别在于ArrayList数组具有固定大小,而ArrayList可以根据需要动态增长大小。因此,如果您确信您的数组大小不会改变,那么您可以使用它。但是,如果您想稍后添加元素,那么作为接口ArrayList实现的anList就是要走的路。

虽然 anArrayList在内部由 an arrayonly 支持。因此,它在内部也使用了一个固定大小的数组,初始容量为10(可以更改),但该细节在内部是隐藏的。因此,您不必担心ArrayList.

每当您在 中添加超过当前数组大小的元素时ArrayList,都会扩展内部数组。这意味着,如果您定期插入大量元素,则定期扩展大小可能会成为开销。虽然这种情况很少见。不过,您也可以在创建ArrayList. 所以,这由你来决定。

至于VectorvsArrayList讨论, yesVector现在已被弃用(虽然在技术上并非如此,但正如@Luiggi 的评论中所述,不鼓励使用它),您应该使用ArrayList. 不同之处在于Vector同步每个操作,这几乎从不需要。当您需要同步时,您始终可以使用Collections.synchronizedList.

有关此讨论的更多信息,请参阅此帖子

AnArrayList是 的实现List。还有其他变化。就像你也有一个LinkedList,来获得传统链表的功能。

于 2013-07-13T18:59:50.403 回答
0

Vector Class 实际上已被弃用,而是使用 ArrayList,这是正确的吗?

是的,这是正确的。Vector 类和其他一些集合已弃用,取而代之的是 ArrayList、Map 等新集合。以下是不推荐使用 Vector 的几个原因

是否有关于我应该在哪里使用 ArrayList 而不是简单数组的规则?

几乎总是。我可以想到你应该使用数组的两个原因:

  • 使 JNI 调用更容易。将简单的数组从 C++ 发送到 Java 比 ArrayList 的对象容易得多
  • 您可以获得一点性能,因为访问简单数组的元素不需要边界检查和方法调用。

另一方面,使用 ArrayList 有很多优点。添加新元素时无需考虑控制数组的大小,可以使用 ArrayList 的简单 API 从集合中添加/删除元素等。

于 2013-07-13T18:54:19.770 回答
0

我就加两分钱。

如果您需要原始数据的集合和优化问题,数组总是会更快,因为它消除了自动装箱和自动拆箱的要求。

于 2017-10-26T04:14:47.380 回答