[Java基础]ArrayList和Vector的区别[收集]

本文详细对比了Java中ArrayList与Vector的特性与使用场景。主要内容包括两者的线程安全性、数据增长方式、性能开销及使用模式等关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

关于ArrayList和Vector区别如下:
1. ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
2. Vector提供indexOf(obj, start)接口,ArrayList没有。
3. Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

ArrayList
   ArrayList 实现了可变大小的数组。它允许所有元素,包括 nullArrayList 没有同步。
size
isEmptygetset 方法运行时间为常数。但是 add 方法开销为分摊的常数,添加 n 个元素需要 O(n) 的时间。其他的方法运行时间为线性。
  每个 ArrayList 实例都有一个容量( Capacity ),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法   并没有定义。当需要插入大量元素时,在插入前可以调用 ensureCapacity 方法来增加 ArrayList 的容量以提高插入效率。
  和 LinkedList 一样, ArrayList 也是非同步的( unsynchronized )。

Vector

   Vector 非常类似 ArrayList ,但是 Vector 是同步的。由 Vector 创建的 Iterator ,虽然和 ArrayList 创建的 Iterator 是同一接口,但是,因为 Vector 是同步的,当一个 Iterator 被创建而且正在被使用,另一个线程改变了 Vector 的状态(例如,添加或删除了一些元素),这时调用 Iterator 的方法时将抛出 ConcurrentModificationException ,因此必须捕获该异常。

同步性
Vector
是同步的。这个类中的一些方法保证了 Vector 中的对象是线程安全的。而 ArrayList 则是异步的,因此 ArrayList 中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用 ArrayList 是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。

数据增长
从内部实现机制来讲 ArrayListVector 都是使用数组 (Array) 来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度, Vector 缺省情况下自动增长原来一倍的数组长度, ArrayList 是原来的 50%, 所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用 Vector 有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。

使用模式
ArrayListVector 中,   从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用 O(1) 表示。但是,如果在集合的其他位   置增加或移除元素那么花费的时间会呈线形增长: O(n-i) ,其中 n 代表集合中元素的个数, i 代表元素增加或移除元素的索引位置。为什么会这样呢?以为在   进行上述操作的时候集合中第 i 和第 i 个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?
这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用 VectorArrayList 都可以。如果是其他操作,你最好选择其他的集合操作类。比如, LinkList 集合类在增加或移除集合中任何位置的元素所花费的时间都   是一样的 ?O(1) ,但它在索引一个元素的使用缺比较慢- O(i), 其中 i 是索引的位置 . 使用 ArrayList 也很容易,因为你可以简单的使用索引来代   替创建 iterator 对象的操作。 LinkList 也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。
最后,在《 Practical Java 》一书中 Peter Haggar 建议使用一个简单的数组( Array )来代替 VectorArrayList 。尤其是对于执行效率要求高的程序更应如此。因为使用数组 (Array) 避免了同步、额外的方法调用和不必要的重新分配空间的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值