ArrayList和Vector有什么区别?
两个数据结构ArrayList和Vector之间有什么区别,你应该在哪里使用它们?
差异
- 向量是同步的,ArrayLists不是。
- 数据增长方法
如果没有特殊要求使用Vector,则使用ArrayList。
同步
如果多个线程同时访问一个ArrayList,那么我们必须从外部同步修改列表的代码块,或者在结构上修改或者只是修改一个元素。 结构修改是指从列表中添加或删除元素。 设置现有元素的值不是结构修改。
通常在创build列表时使用Collections.synchronizedList
,以避免对列表的意外非同步访问。
参考
数据增长
在内部,ArrayList和Vector都使用数组保存其内容。 当一个元素被插入到一个ArrayList或者一个Vector中时,如果对象空间不足,需要扩展它的内部数组。 Vector默认将其数组的大小加倍,而ArrayList将其数组大小增加50%。
参考
正如文档所述, Vector
和ArrayList
几乎是等价的。 不同之处在于对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之间有两个主要区别。
-
Vector默认是同步的,ArrayList不是。 注意:通过将ArrayList对象传递给Collections.synchronizedList()方法,可以使ArrayList同步。 同步意味着:它可以用于多个线程,没有任何副作用。
-
如果空间不足以满足新元素的要求,ArrayLists将增加50%以前的大小,如果新的元素没有空间,Vector将增加100%以前的大小。
除此之外,就编程工作而言,它们之间有一些实际的区别:
- 为了从Vector中获取特定位置的元素,我们使用elementAt (int index)函数。 这个函数的名字很长。 在ArrayList中,我们得到了 (int index),这非常容易记住和使用。
- 类似地,用Vector中的新元素replace现有的元素,我们使用setElementAt ()方法,该方法又非常冗长,可能会刺激程序员重复使用。 代替这个ArrayList有add (int index,object)方法,这个方法很容易使用和记忆。 像这样,他们在ArrayList中有更多的程序员友好和易于使用的函数名称。
何时使用哪一个?
- 尽量避免使用vector完全。 ArrayLists可以完成Vector所能做的一切。 ArrayLists默认不会同步。 如果需要,可以使用Collections util类在需要时进行同步。
- 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是向量溢出时容量增加的量,所以它对载入因子有更多的控制。
其他的一些差异是:
ArrayList
和Vector
都实现了List接口并保持插入顺序。但是ArrayList
和Vector
类有很多不同之处…
ArrayList –
-
ArrayList
不同步。 - 如果元素的数量超过其容量,则
ArrayList
增加当前数组大小的50%。 -
ArrayList
不是一个遗留类,它是在JDK 1.2中引入的。 -
ArrayList
速度很快,因为它是非同步的。 -
ArrayList
使用Iterator接口遍历元素。
vector –
-
Vector
是同步的。 - 如果元素总数超过其容量,
Vector
增加100%意味着将数组大小加倍。 -
Vector
是一个传统的类。 -
Vector
很慢,因为它是同步的,即在multithreading环境中,它将其他线程保持在可运行或不可运行状态,直到当前线程释放对象的locking为止。 -
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
。 当溢出和删除发生时,它们都会自动增长和缩小。