数组列表和向量有什么区别?

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

261206 次浏览

差异

  • 向量是同步的,数组列表 李不是。< / >
  • 数据增长方法

如果对vector没有特殊要求,请使用数组列表。

同步

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

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

数据增长

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

ArrayList更新,速度快20-30%。

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

正如文档所述,VectorArrayList0几乎是等价的。区别在于,对Vector的访问是同步的,而对ArrayList的访问不是同步的。这意味着一次只有一个线程可以调用Vector上的方法,并且在获取锁时有轻微的开销;如果你使用ArrayList,情况就不同了。一般来说,你会想要使用ArrayList;在单线程的情况下,这是一个更好的选择,在多线程的情况下,您可以更好地控制锁定。想要允许并发读取?很好。想要对一批10个写入执行一次同步吗?还好。这确实需要你多加小心,但这很可能是你想要的。还要注意的是,如果你有一个数组列表,你可以使用ArrayList1函数来创建一个同步列表,从而得到一个等价的Vector

Vector是一个破碎的类,它是线程安全的,尽管它是“同步的”,并且被学生和其他没有经验的程序员使用。

ArrayList是专业人员和有经验的程序员使用的List实现。

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

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

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

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

其他一些不同之处是: enter image description here

在向量和数组列表之间有两个主要的区别。

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

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

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

    要从Vector中获取特定位置的元素,使用elementAt(int index)函数。这个函数名非常长。 在数组列表中,我们用得到(int index)来代替它 易于记忆和使用。 类似地,用Vector中的新元素替换现有元素,我们使用setElementAt()方法,这同样非常冗长,可能会让程序员反复使用。代替这个ArrayList的是添加(int index, object)方法,它易于使用和记忆。 像这样,它们在数组列表中有更适合程序员使用和易于使用的函数名

什么时候用哪个?

  1. 尽量避免完全使用vector。数组列表能做向量能做的所有事情。默认情况下,数组列表是不同步的。如果您愿意,可以使用Collections util类在需要时同步它。
  2. ArrayList函数名易于记忆和使用。

请注意:即使数组列表增长了100%,你可以通过ensurecapacity()方法来避免这种情况,以确保你在初始阶段本身分配了足够的内存。

希望能有所帮助。

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

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

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