差异
如果没有特殊要求使用向量(Vector),则使用ArrayList。
同步
如果多个线程同时访问ArrayList,则必须对修改列表的代码块进行外部同步,无论是结构上修改列表还是简单地修改元素。结构修改指添加或删除一个或多个元素到列表中。设置现有元素的值不属于结构性修改。
通常在创建列表时使用Collections.synchronizedList
以避免意外的非同步访问。
数据增长
在内部,ArrayList和Vector都使用数组来保存其内容。当将元素插入ArrayList或Vector时,如果它们的内部数组已经满了,则对象需要扩展其内部数组。向量默认情况下将其数组大小加倍,而ArrayList将其数组大小增加50%。
Vector
和ArrayList
几乎等同。区别在于对Vector
的访问是同步的,而对ArrayList
的访问则不是。这意味着只有一个线程可以同时调用Vector
上的方法,并且在获取锁时会有轻微的开销;如果你使用ArrayList
,那么就不会有这个问题。通常情况下,你会想使用ArrayList
;在单线程情况下,它是更好的选择,在多线程情况下,你可以更好地控制锁定。想允许并发读取?可以。想为十次写操作执行一次同步?也可以。这需要你稍微费些心思,但这很可能是你想要的。此外,请注意,如果你拥有一个ArrayList
,你可以使用Collections.synchronizedList
函数创建一个同步列表,这样就可以获得一个Vector
的等效对象。Vector
是一个破损的类,尽管它被“同步”,但它不是线程安全的,只适用于学生和其他经验不足的程序员。
ArrayList
是专业人士和有经验的程序员使用的首选列表实现。
想要线程安全的列表实现的专业人士使用CopyOnWriteArrayList
。
Vector
本意是线程安全的,但存在设计缺陷使其实际上并非线程安全,它基本上已成为一个废弃的类。出于某种原因,一些大学等机构还没有听说过这个消息,并仍然倡导使用它。 - BohemianCollections.synchronizedList()
是低效的,而且已经被淘汰。根据 javadoc 的说明,客户端必须手动同步返回的列表以安全地进行迭代:虽然是线程安全的,但多个线程不能同时安全地迭代,这使它成为一种残酷、不可扩展的解决方案。它的使用已被 java.util.concurrent
类取代。 - BohemianArrayList
是较新的数据结构,速度比 Vector
快 20-30%。
如果你不需要 Vector
特有的功能,可以使用 ArrayList
。
Vector和ArrayList有2个主要区别:
Vector默认是同步的,而ArrayList不是。 注意:你可以通过将arraylist对象传递给Collections.synchronizedList()方法来使ArrayList也变成同步的。同步意味着:它可以与多个线程一起使用,没有任何副作用。
当空间不足以容纳新元素时,ArrayList的大小增长了前一个大小的50%,而Vector将增长前一个大小的100%。
除此之外,在编程方面还存在一些实际差异:
何时使用哪个?
注意:即使ArrayList增长了100%,您也可以通过ensurecapacity()方法避免这种情况,以确保在最初阶段分配足够的内存。
希望能对你有所帮助。
ArrayList
和Vector
都实现了List接口并保持插入顺序。但是ArrayList
和Vector
类之间有很多区别...
ArrayList
是非同步的。ArrayList
会将当前数组大小增加50%。ArrayList
不是遗留类,它是在JDK 1.2中引入的。ArrayList
快速,因为它是非同步的。ArrayList
使用Iterator接口来遍历元素。Vector -
Vector
是同步的。Vector
会将数组大小增加100%,即翻倍。Vector
是一个遗留类。
Vector
慢,因为它是同步的,即在多线程环境中,它将保持其他线程处于可运行或不可运行状态,直到当前线程释放对象的锁。
Vector
使用Enumeration接口来遍历元素。但它也可以使用Iterator。
参见:https://www.javatpoint.com/difference-between-arraylist-and-vector
Vector v = new Vector(3, 2);
- sgsiVector
,请使用ArrayList
、LinkedList
或者ArrayDeque
。 - user8389458