ChatGPT解决这个技术问题 Extra ChatGPT

ArrayList 和 Vector 有什么区别?

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

我在这里没有看到确切的副本。
好吧,您也可以在 java 中创建向量 - Vector v = new Vector(3, 2);
切勿使用 Vector,使用 ArrayListLinkedListArrayDeque

S
Steve Chambers

差异

向量是同步的,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 的名称是正确的吗?因为在物理向量中具有完全不同的含义。但在数学中,他们说向量是一行数据。
A
Antal Spector-Zabusky

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


C
Community

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

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

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


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

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

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


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

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

Vector 默认是同步的,ArrayList 不是。注意:您可以通过将 arraylist 对象传递给 Collections.synchronizedList() 方法来使 ArrayList 也同步。同步意味着:它可以与多个线程一起使用而没有任何副作用。当空间不足以容纳新元素时,ArrayLists 将增长 50% 的先前大小,而当没有空间容纳新传入元素时,Vector 将增长先前大小的 100%。

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

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

什么时候用哪一个?

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

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

希望能帮助到你。


ArrayLIst 和 Vector 的增长大小的错误信息(切换),否则很好的答案。
Vector 的增长是所需的 docs.oracle.com/javase/7/docs/api/java/util/Vector.html 的两倍,而 ArrayList 的增长“除了添加元素具有恒定的摊销时间成本这一事实之外,没有指定增长策略的细节。” docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
我不明白方法名称如何成为使用或不使用该方法的标准。
r
roottraveller

ArrayListVector 都实现了 List 接口并维护了插入顺序。但是 ArrayListVector 类之间有很多不同...

ArrayList -

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

Vector -

矢量是同步的。向量增量 100% 意味着如果元素总数超过其容量,则数组大小加倍。 Vector 是一个遗留类。 Vector很慢,因为它是同步的,即在多线程环境中,它将保持其他线程处于可运行或不可运行状态,直到当前线程释放对象的锁定。 Vector 使用 Enumeration 接口遍历元素。但它也可以使用迭代器。

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


s
subhashis

基本上 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 是向量溢出时容量增加的量,因此它可以更好地控制负载因子。

https://i.stack.imgur.com/sUukc.png


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