集合:Array,Vector和ArrayList。差异和适当的用法

时间:2013-07-13 18:46:06

标签: java arrays vector arraylist

首先我应该说,在我的书(2005)中,Vector<E>(广泛使用)代替数组。与此同时,没有任何解释,两者之间存在差异。检查VectorOracle Doc,可以很容易地理解它的用法。

对StackOverflow和Google进行了一些额外的研究,我发现Vector类实际上已被弃用,而使用ArrayList代替这是正确的吗? {{3} }

我无法理解的部分:我应该使用ArrayList而不是简单数组的规则?似乎我应该始终使用{{1} }。它看起来更有效,并且应该更容易实现值/对象的集合,这种方法是否有任何不利之处?

4 个答案:

答案 0 :(得分:4)

一些历史:

  • Vector自Java 1.0以来就存在;
  • {1}}接口自Java 1.2起存在,List;
  • 也存在
  • ArrayList已经过改造,可以同时实施Vector界面;
  • Java 5,介绍泛型,已于2004年推出(link)。

你的课程,可以追溯到2005年,应该在列表中知道List(对不起,至少),并且也应该引入泛型。

对于ArrayList,有Array,它有助于对数组的反射(即java.lang.reflect.Array等)。

基本上:

  • int[]同步所有操作,这在90%以上的情况下都是浪费;
  • 如果你想要并发集合,Java 5引入了VectorConcurrentHashMap等,你应该使用它们;
  • 在任何情况下都不要再使用CopyOnWriteArrayList; JDK中的一些代码仍然使用它,但它是出于向后兼容的原因。在新的代码中,有更好的替代方案,如前一点所述;
  • 自Java 1.2起,Vector无法提供与之前提供的相同的线程安全保证。

后一点很有意思。 Vector之前有Iterator,而Enumeration没有提供删除元素的可能性;但是,Enumeration确实如此。

因此,让我们采用两个线程Iteratort1,一个t2,以及那两个线程在该向量上有Vector。线程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 实际上线程安全。自Java 5引入“foreach循环”以来,它的线程安全性更低,它创建了一个“隐藏”的迭代器。

答案 1 :(得分:3)

arrayArrayList之间的基本区别在于数组具有固定大小,而ArrayList可以根据需要动态增大。因此,如果您确信您的阵列大小不会改变,那么您可以使用它。但是如果你想稍后添加元素,那么ArrayList是一个List接口的实现,是可行的方法。

虽然ArrayList仅由array内部支持。因此,在内部它也使用固定大小的数组,初始容量 10 (可以改变),但该细节在内部隐藏。因此,您不必担心ArrayList的大小变化。

每当您在ArrayList中添加超过当前数组大小的元素时,内部数组都会被扩展。这意味着,如果您经常插入大量元素,则规则扩展可能会成为开销。虽然这种情况很少发生。不过,您还可以在创建ArrayList时提供自己的初始尺寸。所以,由你来决定。

关于Vector vs ArrayList讨论,是Vector现在已被弃用(但不是技术上的,但不鼓励使用@Luiggi的评论中所述),您应该使用ArrayList。区别在于Vector同步每个操作,这几乎不需要。需要同步时,始终可以使用Collections.synchronizedList创建同步列表。

有关此讨论的更多信息,请参阅this post

ArrayListList的实现。还有其他变化。就像你还有一个LinkedList一样,可以获得传统链接列表的功能

答案 2 :(得分:0)

  
    

实际上不推荐使用Vector类,而是使用ArrayList,这是正确的吗?

  

是的,这是正确的。不推荐使用Vector类和其他一些集合,并替换为ArrayList,Map等新集合。以下是few为什么不推荐使用Vector的原因

  
    

我应该使用ArrayList而不是简单的数组吗?

  

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

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

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

答案 3 :(得分:0)

我只想加两分钱。

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