ArrayList和Vector有什么区别?

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

差异

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

如果没有特殊要求使用Vector,则使用ArrayList。

同步

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

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

参考

数据增长

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

参考

正如文档所述, VectorArrayList几乎是等价的。 不同之处在于对Vector访问是同步的,而对ArrayList访问则不是。 这意味着一次只有一个线程可以调用Vector上的方法,并且在获取锁的时候会有一些额外的开销。 如果您使用ArrayList ,则不是这种情况。 一般来说,你会想使用一个ArrayList ; 在单线程的情况下,这是一个更好的select,在multithreading的情况下,你可以更好地控制locking。 要允许并发读取? 精细。 想要为一批十个写入执行一个同步? 还好。 它确实需要更多的关心你的目的,但它可能是你想要的。 还要注意,如果你有一个ArrayList,你可以使用Collections.synchronizedList函数来创build一个同步列表,从而使你得到一个Vector的等价物。

Vector是一个破碎的类, 不是线程安全的,尽pipe它是“同步”, 只有学生和其他经验不足的程序员使用。

ArrayList是由专业人员和有经验的程序员使用的前往列表实现。

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

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

如果你不需要Vector中明显的东西,使用ArrayList

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

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

  2. 如果空间不足以满足新元素的要求,ArrayLists将增加50%以前的大小,如果新的元素没有空间,Vector将增加100%以前的大小。

除此之外,就编程工作而言,它们之间有一些实际的区别:

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

何时使用哪一个?

  1. 尽量避免使用vector完全。 ArrayLists可以完成Vector所能做的一切。 ArrayLists默认不会同步。 如果需要,可以使用Collections util类在需要时进行同步。
  2. ArrayList很容易记住和使用函数名称。

注意 :尽pipearraylist增长了100%,你可以通过ensurecapacity()方法来避免这一点,以确保在初始阶段本身分配足够的内存。

希望它有帮助。

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

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

Vector: Vector类似于ArrayList,不同之处在于它是同步的,它的默认初始大小是10,当大小超过它的大小增加到原始大小的两倍,这意味着新的大小将是20.vector是唯一的类除了ArrayList来实现RandomAccess。 Vector有四个构造函数,其中一个取两个参数Vector(int initialCapacity,int capacityIncrement) capacityIncrement是向量溢出时容量增加的量,所以它对载入因子有更多的控制。

其他的一些差异是: 在这里输入图像描述

ArrayListVector都实现了List接口并保持插入顺序。但是ArrayListVector类有很多不同之处…

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很慢,因为它是同步的,即在multithreading环境中,它将其他线程保持在可运行或不可运行状态,直到当前线程释放对象的locking为止。

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

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

ArrayList与vector:

1) 同步: ArrayList是非同步的,这意味着多个线程可以同时在ArrayList上工作。 例如,如果一个线程正在对ArrayList执行添加操作,则可能有另一个线程在multithreading环境中同时对ArrayList执行移除操作

而vector是同步的。 这意味着如果一个线程在Vector上工作,其他任何线程都无法保留它。 与ArrayList不同的是,一次只有一个线程可以对vector执行操作。

2) resize: ArrayList和Vector都可以dynamic增长和缩小,以保持存储的最佳使用,但resize的方式是不同的。 在resize时,ArrayList的大小会增加一半,而Vector在默认情况下会增加一倍。

3) 性能: ArrayList提供更好的性能,因为它是不同步的。 向量操作由于它们是线程安全的而导致性能较差,在Vector上工作的线程获取locking,使得其他线程等待,直到locking被释放。

4) fail-fast:首先让我解释一下什么是fail-fast:如果集合(ArrayList,vector等)通过任何方式得到结构修改,除了迭代器的add或remove方法之外,在迭代器创build之后,迭代器会抛出ConcurrentModificationException的。 结构修改是指从集合中添加或删除元素。

根据Vector javadoc,Vector返回的Enumeration不是快速失败的。 另一方面,由ArrayList返回的迭代器和listIterator是快速失​​败的。

5)谁真的属于收集框架? 这个向量不是集合框架的一部分,它以后也被包含在集合中。 它可以被认为是遗留代码。 Vector List列表集合不能做什么。 所以应该避免使用Vector。 如果需要线程安全的操作,则使ArrayList同步,如本文后面的部分所讨论的,或使用CopyOnWriteArrayList,它是ArrayList的线程安全变体。

这些类别之间几乎没有相似之处 ,如下所示:

Vector和ArrayList都使用可growable array data structure 。 由这些类(Vector和ArrayList)返回的迭代器和listIterator是fail-fast 。 他们都是ordered collection类,因为他们维护元素的插入顺序。 Vector&ArrayList都allows duplicate and null values 。 当溢出和删除发生时,它们都会自动增长和缩小。