ArrayList和Vector有什么区别?


352

这两个数据结构ArrayListVector之间有什么区别,应在哪里使用它们?


5
我在这里没有看到确切的重复。
杰夫·阿特伍德

2
好了,您也可以在Java中创建矢量 Vector v = new Vector(3, 2);
sgsi 2015年

永远不要使用Vector,使用ArrayListLinkedListArrayDeque

Answers:


365

差异性

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

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

同步化

如果多个线程同时访问ArrayList,则我们必须在外部同步代码块,该代码块在结构上或仅在修改元素时会修改列表。结构修饰是指从列表中添加或删除元素。设置现有元素的值不是结构上的修改。

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

参考

数据增长

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

参考



怎样以多线程方式从ArrayList读取?那是线程安全的吗?
许妮

@Xunie从ArrayList或其他集合类中读取数据绝对不是问题。当您向ArrayList或集合中添加或删除或修改现有值时,就会出现问题。
sainath reddy

85

如文档所述,a Vector和an ArrayList几乎相等。不同之处在于对a的访问Vector是同步的,而对a的访问ArrayList则不同步。这意味着一次只能有一个线程可以在一个线程上调用方法Vector,并且获取锁的开销很小。如果使用ArrayList,则不是这种情况。通常,您将需要使用ArrayList;; 在单线程情况下,这是一个更好的选择;在多线程情况下,您可以更好地控制锁定。要允许并发读取吗?精细。是否想对十次写入执行一次同步?还可以 它确实需要在您的末端多一点照顾,但可能正是您想要的。另请注意,如果您有ArrayList,则可以使用Collections.synchronizedList函数来创建同步列表,从而使您等效于Vector


53

Vector尽管它是“同步的”,但它还是一个不是线程安全的中断类,由学生和其他经验不足的程序员使用。

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

希望使用线程安全List实现的专业人员使用CopyOnWriteArrayList


10
同步但不是线程安全的?这是什么意思?[我是初学者]
Dineshkumar,2013年

13
@Dineshkumar Vector是线程安全的,但有一个设计缺陷,它使*不事实上线程安全的,它基本上是一个过时的类。由于某些原因,大学等尚未听说此消息,仍主张使用它。
波希米亚

1
@Dineshkumar看到这个问题
波希米亚

3
@Dineshkumar抱歉-这不是一个很好的链接。这是确定的答案。简而言之,它的同步是无用的。
波希米亚

7
有趣的事实:Java1.7堆栈使用Vector类。
Tobi 2013年

26

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

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


32
您可以通过提供证据来支持索赔20-30% faster吗?
用户

5
@user当时只是散落在大量数组中的个人经验。三年多来了,我无法准确地指出您在说什么,但是那里有很多基准。直到线程出现最大的跳跃,这才
Oli

如果您读取和写入向量/数组列表,则只有20%到30%的匹配,因为增长功能会产生最大的影响。如果您的基准测试仅写入一次,然后仅执行读取操作,则会产生不同的结果
Tobi 2013年

2
请为您的数据提供证据
有线标记

由于向量是同步的,而arraylist是不同步的,这可能是一个原因,arraylist比向量要快。
询问

23

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

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

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

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

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

什么时候使用哪个?

  1. 尝试避免完全使用Vector。ArrayList可以完成Vector可以完成的所有工作。更多信息ArrayList默认情况下不同步。如果需要,可以使用Collections util类在需要时进行同步。
  2. ArrayList具有易于记忆和使用的函数名称。

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

希望能帮助到你。


5
ArrayLIst和Vector的增长大小信息错误(已切换),否则答案很不错。
Nenad Bulatovic 2015年

在ArrayList中,Vector的增长是所需的docs.oracle.com/javase/7/docs/api/java/util/Vector.html的两倍“除了添加元素具有固定的摊销时间成本。” docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib 2015年

我不明白该方法名称如何成为使用或不使用该方法的标准。
Surender Kherwa '19

14

ArrayListVector这两种工具列表界面,并保持插入order.But有很多区别ArrayListVector类...

ArrayList的 -

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

向量 -

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

  4. Vector 之所以缓慢是因为它是同步的,即在多线程环境中,它将使其他线程处于可运行或不可运行状态,直到当前线程释放对象锁为止。

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

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


10

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

其他一些区别是: 在此处输入图片说明


1
为什么在LinkedList的开头和结尾添加对象比较慢?它不应该比arrayList和vector都快吗?
CHANist '16

@CHANist我也同意。在开始和结束处添加一个对象应该比在其中间添加一个对象要快。
拉胡尔·拉斯托吉

1
该表的LinkedList列中使用的语言是矛盾的。在LinkedList的前面和后面都比在中间添加元素要快,但是比在ArrayLists或Vector前面或后面要慢。这是因为每次插入都需要使用非本地引用分配内存,从而增加了高速缓存未命中的机会。即使LinkedList中的查找与元素数量成线性关系,并且不存储指向末尾的指针,但附加操作仍比预先添加要快,因为仅为一个元素重新分配了内存。
Sophia Gold
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.