【问题标题】:What are the differences between ArrayList and Vector?ArrayList 和 Vector 有什么区别?
【发布时间】:2011-02-28 12:01:57
【问题描述】:

ArrayList和Vector这两种数据结构有什么区别,分别在哪里使用?

【问题讨论】:

  • 我在这里没有看到完全相同的副本。
  • 好吧,你也可以在 java 中创建向量 - Vector v = new Vector(3, 2);
  • 永远不要使用Vector,使用ArrayList或LinkedList或ArrayDeque

标签: java vector arraylist


【解决方案1】:

区别

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

如果没有使用 Vectors 的特定要求,请使用 ArrayLists。

同步

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

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

数据增长

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

【讨论】:

  • @Rei 果然如他所说:多线程 (docs.oracle.com/javase/tutorial/essential/concurrency/…)
  • 如何以多线程方式从 ArrayList 中读取?那是线程安全的吗?
  • @Xunie 从 ArrayList 或其他集合类中读取永远不会成为问题。当您向 ArrayList 或集合添加、删除或修改现有值时,就会出现问题。
  • 答案底部给出的参考链接已过时并导致垃圾邮件。
  • 任何人都可以证明Vector这个名字是正确的吗?因为在物理向量中具有完全不同的含义。但在数学中,他们说向量是一行数据。
【解决方案2】:

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

如果您不需要在 Vector 中明确显示的内容,请使用 ArrayList

【讨论】:

  • 您能否通过提供20-30% faster的证据来支持该主张?
  • @user 当时这只是个人在大型阵列上的经验。三年多过去了,我无法准确地指出我在说什么,但那里有很多基准。直到线程你看到最大的跳跃,但这里有一个:javacodegeeks.com/2010/08/…
  • 只有 20-30% 匹配,如果你对 Vector/Arraylist 进行读写,因为增长函数会产生最大的影响。如果您有一个只写入一次然后只执行读取的基准测试将提供不同的结果
  • 请为您的数据提供证据
  • 由于vector是同步的,arraylist是不同步的,可能是arraylist比vector快的原因。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    Vector 是一个非线程安全的broken 类,尽管它是“同步的”并且仅由学生和其他没有经验的程序员使用。 p>

    ArrayList 是专业人士和经验丰富的程序员使用的首选 List 实现。

    想要线程安全列表实现的专业人士使用CopyOnWriteArrayList。

    【讨论】:

    • 同步但不是线程安全的?这是什么意思? [我是初学者]
    • @Dineshkumar Vector 被打算是线程安全的,但是有一个设计缺陷使它不是实际上是线程安全的,它基本上是一个已弃用的类。出于某种原因,大学等没有听说过这个消息,仍然提倡使用它。
    • @Dineshkumar 见this quesion
    • @Dineshkumar 抱歉 - 这不是一个好的链接。这是definitive answer。总之,它的同步是没用的。
    • 趣事:Java1.7的Stack使用Vector类。
    【解决方案5】:

    基本上 ArrayList 和 Vector 都使用内部对象数组。

    ArrayList: ArrayList 类扩展了 AbstractList 并实现了 List 接口和 RandomAccess(标记接口)。 ArrayList 支持可以根据需要增长的动态数组。它给了我们对元素的第一次迭代。 ArrayList 使用内部对象数组;它们是使用默认初始大小 10 创建的。超过此大小时,集合会自动增加到默认大小 15 的一半。

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

    其他一些区别是:

    【讨论】:

    • 为什么在LinkedList中先添加对象,最后添加对象很慢?不应该比 BOTH arrayList 和 vector 都快吗?
    • @CHANist 我也同意。在开始和结束处添加对象应该比在中间添加对象更快。
    • 该表的LinkedList列使用的语言是矛盾的。前置和附加到 LinkedList 都比在中间添加元素快,但比前置或附加到 ArrayList 或 Vectors 慢。这是因为每次插入都需要使用非本地引用分配内存,从而增加了缓存未命中的机会。尽管 LinkedList 中的查找与元素的数量成线性关系,并且没有存储指向末尾的指针,但追加仍然比前置要快,因为只为一个元素重新分配内存。
    【解决方案6】:

    Vector 和 ArrayList 有两个主要区别。

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

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

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

    1. 要从 Vector 中获取特定位置的元素,我们使用 elementAt(int index) 函数。这个函数名很长。 在 ArrayList 中我们使用 get(int index) 来代替它,这非常 易于记忆和使用。
    2. 类似地,用 Vector 中的新元素替换现有元素,我们使用 setElementAt() 方法,该方法又非常冗长,可能会刺激程序员重复使用。代替这个 ArrayList 有 add(int index, object) 方法,该方法易于使用和记忆。 像这样,它们在 ArrayList 中具有对程序员更友好且易于使用的函数名称。

    什么时候用哪一个?

    1. 尽量避免完全使用向量。 ArrayLists 可以做 Vector 可以做的所有事情。更多 ArrayLists 默认情况下是不同步的。如果需要,您可以在需要时使用 Collections util 类对其进行同步。
    2. ArrayList 函数名称易于记忆和使用。

    注意:即使 arraylist 增长了 100%,您也可以通过 ensurecapacity() 方法避免这种情况,以确保在初始阶段分配足够的内存。

    希望对你有帮助。

    【讨论】:

    【解决方案7】:

    ArrayList和Vector都实现了List接口并维护了插入顺序。但是ArrayList和Vector类之间有很多区别...

    ArrayList -

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

    Vector -

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

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

    5. Vector 使用枚举接口遍历元素。但它也可以使用迭代器。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 2020-12-27
      • 2013-09-02
      相关资源
      最近更新 更多