ArrayList和Vector有什么区别?

时间:2010-06-06 23:07:31

标签: java vector arraylist

两个数据结构 ArrayList Vector 之间有什么区别,您应该在哪里使用它们?

8 个答案:

答案 0 :(得分:339)

<强>差异

  • 向量是同步的,ArrayLists 不是。
  • 数据增长方法

如果没有特定要求使用向量,请使用ArrayLists。

<强>同步

如果多个线程同时访问ArrayList,那么我们必须在外部同步代码块,从而在结构上修改列表或简单地修改元素。结构修改意味着从列表中添加或删除元素。设置现有元素的值不是结构修改。

Collections.synchronizedList通常在创建列表时使用,以避免对列表进行任何意外的不同步访问。

Reference

数据增长

在内部,ArrayList和Vector都使用Array保存其内容。当元素插入到ArrayList或Vector中时,如果对象耗尽空间,则该对象将需要扩展其内部数组。 Vector默认将其数组的大小加倍,而ArrayList将其数组大小增加50%。

Reference

答案 1 :(得分:80)

正如文档所述,VectorArrayList几乎相同。区别在于对Vector的访问是同步的,而对ArrayList的访问则不是。这意味着只有一个线程可以一次调用Vector上的方法,并且获取锁定会有轻微的开销;如果您使用ArrayList,则情况并非如此。通常,您需要使用ArrayList;在单线程的情况下,它是一个更好的选择,在多线程的情况下,您可以更好地控制锁定。想要允许并发读取?精细。想要为一批10次写入执行一次同步?还好。它确实需要你更多的关心,但它可能是你想要的。另请注意,如果您有ArrayList,则可以使用Collections.synchronizedList函数创建同步列表,从而获得相当于Vector的内容。

答案 2 :(得分:45)

Vectorbroken类,线程安全,尽管它已“同步”并且被学生和其他没有经验的人使用程序员。

ArrayList是专业人士和有经验的程序员使用的首选列表实现。

需要线程安全List实现的专业人员使用CopyOnWriteArrayList

答案 3 :(得分:26)

ArrayList更新,速度提高20-30%。

如果您不需要Vector中显而易见的内容,请使用ArrayList

答案 4 :(得分:22)

Vector和ArrayList之间有两个主要区别。

  1. 默认情况下,Vector是同步的,而ArrayList则不是。 注意:您可以通过将arraylist对象传递给Collections.synchronizedList()方法来使ArrayList同步。 同步意味着:它可以与多个线程一起使用,没有任何副作用。

  2. 当空间不足以容纳新元素时,ArrayLists将增加前一个大小的50%,而当没有新传入元素的空间时,Vector将增加前一个大小的100%。

  3. 除此之外,在编程工作方面,它们之间存在一些实际差异:

    1. 要从Vector获取元素到特定位置,我们使用 elementAt (int index)函数。这个函数名称非常冗长。 在ArrayList中我们有 get (int index),这是非常的 易于记忆和使用。
    2. 与使用Vector中的新元素替换现有元素类似,我们使用 setElementAt ()方法,这又是非常冗长的,可能会激怒程序员重复使用。代替此ArrayList具有添加(int index,object)方法,该方法易于使用和记忆。 像这样,他们在ArrayList中有更多程序员友好且易于使用的函数名称。
    3. 何时使用哪一个?

      1. 尽量避免完全使用向量。 ArrayLists可以完成Vector可以执行的所有操作。默认情况下,ArrayLists的更多内容不会同步。如果需要,可以使用Collections util class在需要时同步它。
      2. ArrayList易于记忆和使用函数名称。
      3. 注意:即使arraylist增长100%,你也可以通过ensurecapacity()方法避免这种情况,以确保你在初始阶段分配足够的内存。

        希望它有所帮助。

答案 5 :(得分:13)

ArrayListVector都实现了List接口并维护了插入顺序。但ArrayListVector类之间存在很多差异......

ArrayList -

  1. ArrayList未同步。
  2. 如果元素数量超过其容量,
  3. ArrayList会增加当前数组大小的50%。
  4. ArrayList不是遗留类,它是在JDK 1.2中引入的。
  5. ArrayList很快,因为它是非同步的。
  6. ArrayList使用Iterator接口遍历元素。
  7. Vector -

    1. Vector已同步。
    2. Vector增量100%表示如果元素总数超过其容量,则会使数组大小加倍。
    3. Vector是遗产类。

    4. Vector很慢,因为它是同步的,即在多线程环境中,它会将其他线程保持在runnable或non-runnable状态,直到当前线程释放对象锁。

    5. Vector使用Enumeration接口遍历元素。但它也可以使用Iterator。

    6. 另请参阅:https://www.javatpoint.com/difference-between-arraylist-and-vector

答案 6 :(得分:10)

基本上,ArrayList和Vector都使用内部Object Array。

ArrayList: ArrayList类扩展了AbstractList并实现了List接口和RandomAccess(标记接口)。 ArrayList支持可根据需要增长的动态数组。它为我们提供了对元素的第一次迭代。 ArrayList使用内部Object Array;它们的默认初始大小为10.如果超出此大小,则集合将自动增加到默认大小的一半。

向量:向量类似于ArrayList,但区别在于,它是同步的,其默认初始大小为10,当大小超过其大小时,增加到原始大小的两倍,这意味着新的size将是20. Vector是ArrayList以外唯一实现RandomAccess的类。 Vector有四个构造函数,其中一个需要两个参数 Vector(int initialCapacity,int capacityIncrement) capacityIncrement是向量溢出时容量增加的量,因此它可以更好地控制负载因素。

其他一些差异是: enter image description here

答案 7 :(得分:1)

Vector随Java开发工具包(JDK)的第一个版本一起提供。 ArrayList是Java版本1.2的一部分,是Java集合框架的一部分。 ArrayListVector内部都使用Array作为数据结构。这两个类都保留插入顺序。它们都允许重复值和空值。但是,它们存储和处理数据的方式几乎没有差异。

同步

  • ArrayList是不同步的,这意味着多个线程可以同时在ArrayList上工作。
  • Vector已同步,这意味着一次只能有一个线程可以访问代码。

性能

  • ArrayList由于不同步,因此性能更好。
  • Vector操作具有线程安全性,因此性能较差。

遍历

  • ArrayList使用Iterator接口遍历元素。
  • Vector可以使用Iterator接口和Enumeration接口遍历元素。

数据增长

ArrayListVector都动态增长和收缩以保持最佳的存储使用率,但是它们调整大小的方式却有所不同。

    如果元素数量超过其容量,
  • ArrayList将增加当前数组大小的50%。
  • Vector递增100%–实际上使当前数组大小加倍。

旧版

Java的早期版本未包含Collections Framework。重新设计了原始类,以支持收集接口。这些类称为旧类。

  • ArrayList不是旧类。它是在JDK 1.2中引入的。
  • Vector是旧类。

设置增量大小

  • ArrayList未定义增量大小。
  • Vector定义增量大小。

如果需要执行“线程安全”操作,Vector是您最好的选择,因为它可以确保一次仅一个线程访问该集合。但是,如果不需要线程安全操作,则ArrayList是一个更好的选择,因为并发进程会提高性能。