两个数据结构 ArrayList 和 Vector 之间有什么区别,您应该在哪里使用它们?
答案 0 :(得分:339)
<强>差异强>
如果没有特定要求使用向量,请使用ArrayLists。
<强>同步强>
如果多个线程同时访问ArrayList,那么我们必须在外部同步代码块,从而在结构上修改列表或简单地修改元素。结构修改意味着从列表中添加或删除元素。设置现有元素的值不是结构修改。
Collections.synchronizedList
通常在创建列表时使用,以避免对列表进行任何意外的不同步访问。
数据增长
在内部,ArrayList和Vector都使用Array保存其内容。当元素插入到ArrayList或Vector中时,如果对象耗尽空间,则该对象将需要扩展其内部数组。 Vector默认将其数组的大小加倍,而ArrayList将其数组大小增加50%。
答案 1 :(得分:80)
正如文档所述,Vector
和ArrayList
几乎相同。区别在于对Vector
的访问是同步的,而对ArrayList
的访问则不是。这意味着只有一个线程可以一次调用Vector
上的方法,并且获取锁定会有轻微的开销;如果您使用ArrayList
,则情况并非如此。通常,您需要使用ArrayList
;在单线程的情况下,它是一个更好的选择,在多线程的情况下,您可以更好地控制锁定。想要允许并发读取?精细。想要为一批10次写入执行一次同步?还好。它确实需要你更多的关心,但它可能是你想要的。另请注意,如果您有ArrayList,则可以使用Collections.synchronizedList
函数创建同步列表,从而获得相当于Vector
的内容。
答案 2 :(得分:45)
Vector
是broken类,不线程安全,尽管它已“同步”并且仅被学生和其他没有经验的人使用程序员。
ArrayList
是专业人士和有经验的程序员使用的首选列表实现。
需要线程安全List实现的专业人员使用CopyOnWriteArrayList
。
答案 3 :(得分:26)
ArrayList
更新,速度提高20-30%。
如果您不需要Vector
中显而易见的内容,请使用ArrayList
答案 4 :(得分:22)
Vector和ArrayList之间有两个主要区别。
默认情况下,Vector是同步的,而ArrayList则不是。 注意:您可以通过将arraylist对象传递给Collections.synchronizedList()方法来使ArrayList同步。 同步意味着:它可以与多个线程一起使用,没有任何副作用。
当空间不足以容纳新元素时,ArrayLists将增加前一个大小的50%,而当没有新传入元素的空间时,Vector将增加前一个大小的100%。
除此之外,在编程工作方面,它们之间存在一些实际差异:
何时使用哪一个?
注意:即使arraylist增长100%,你也可以通过ensurecapacity()方法避免这种情况,以确保你在初始阶段分配足够的内存。
希望它有所帮助。
答案 5 :(得分:13)
ArrayList
和Vector
都实现了List接口并维护了插入顺序。但ArrayList
和Vector
类之间存在很多差异......
ArrayList
未同步。ArrayList
会增加当前数组大小的50%。ArrayList
不是遗留类,它是在JDK 1.2中引入的。ArrayList
很快,因为它是非同步的。ArrayList
使用Iterator接口遍历元素。Vector -
Vector
已同步。Vector
增量100%表示如果元素总数超过其容量,则会使数组大小加倍。 Vector
是遗产类。
Vector
很慢,因为它是同步的,即在多线程环境中,它会将其他线程保持在runnable或non-runnable状态,直到当前线程释放对象锁。
Vector
使用Enumeration接口遍历元素。但它也可以使用Iterator。
另请参阅:https://www.javatpoint.com/difference-between-arraylist-and-vector
答案 6 :(得分:10)
基本上,ArrayList和Vector都使用内部Object Array。
ArrayList: ArrayList类扩展了AbstractList并实现了List接口和RandomAccess(标记接口)。 ArrayList支持可根据需要增长的动态数组。它为我们提供了对元素的第一次迭代。 ArrayList使用内部Object Array;它们的默认初始大小为10.如果超出此大小,则集合将自动增加到默认大小的一半。
向量:向量类似于ArrayList,但区别在于,它是同步的,其默认初始大小为10,当大小超过其大小时,增加到原始大小的两倍,这意味着新的size将是20. Vector是ArrayList以外唯一实现RandomAccess的类。 Vector有四个构造函数,其中一个需要两个参数 Vector(int initialCapacity,int capacityIncrement) capacityIncrement是向量溢出时容量增加的量,因此它可以更好地控制负载因素。
其他一些差异是:
答案 7 :(得分:1)
Vector
随Java开发工具包(JDK)的第一个版本一起提供。 ArrayList
是Java版本1.2的一部分,是Java集合框架的一部分。 ArrayList
和Vector
内部都使用Array
作为数据结构。这两个类都保留插入顺序。它们都允许重复值和空值。但是,它们存储和处理数据的方式几乎没有差异。
同步
ArrayList
是不同步的,这意味着多个线程可以同时在ArrayList
上工作。 Vector
已同步,这意味着一次只能有一个线程可以访问代码。性能
ArrayList
由于不同步,因此性能更好。 Vector
操作具有线程安全性,因此性能较差。遍历
数据增长
ArrayList
和Vector
都动态增长和收缩以保持最佳的存储使用率,但是它们调整大小的方式却有所不同。
ArrayList
将增加当前数组大小的50%。 Vector
递增100%–实际上使当前数组大小加倍。 旧版
Java的早期版本未包含Collections Framework。重新设计了原始类,以支持收集接口。这些类称为旧类。
ArrayList
不是旧类。它是在JDK 1.2中引入的。Vector
是旧类。设置增量大小
ArrayList
未定义增量大小。 Vector
定义增量大小。如果需要执行“线程安全”操作,Vector
是您最好的选择,因为它可以确保一次仅一个线程访问该集合。但是,如果不需要线程安全操作,则ArrayList
是一个更好的选择,因为并发进程会提高性能。