1、ArrayList 和 Vector 的区别

本文探讨了ArrayList和Vector这两个ArrayList实现类的区别。ArrayList提供快速的随机访问,但在中间插入和删除元素时效率较低,适合遍历和查找。Vector则支持线程同步,保证了多线程环境下的安全性,但同步操作导致其性能低于ArrayList。ArrayList在容量不足时扩展为原容量的1.5倍,而Vector扩展为原容量的2倍。在单线程环境下,推荐使用ArrayList以提高性能。

ArrayList 和 Vector 的区别

  1. ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
  2. Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢

两者的对比:

ArrayListVector
1、实现原理:采用动态对象数组实现,默认构造方法创建了一个空数组1:实现原理:采用动态数组对象实现,默认构造方法创建了一个大小为10的对象数组
2、第一次添加元素,扩展容量为10,之后的扩充算法:原来数组大小+原来数组的一半2、扩充的算法:当增量为0时,扩充为原来大小的2倍,当增量大于0时,扩充为原来大小+增量
3、不适合进行删除或插入操作3、不适合删除或插入操作
4、为了防止数组动态扩充次数过多,建议创建ArrayList时,给定初始容量。4、为了防止数组动态扩充次数过多,建议创建Vector时,给定初始容量
5、多线程中使用不安全,适合在单线程访问时使用,效率较高。5、线程安全,适合在多线程访问时使用,效率较低

源码比较:

ArrayList


Vector

继承了抽象类 》AbstractList》AbstractCollection》

实现了List<E>, RandomAccess, Cloneable, java.io.Serializable 接口

初始化默认大小10,区别,vector初始化时候已经定义为10,ArrayList在增加第一条数据时才设定容量为初始容量10

object 数组实现

方法比较:

vector  synchronized关键字包裹,是同步进行,并且先计算更新次数 modCount,再判断是否需要扩容,最后给地层元素赋值

ArrayList 先执扩容检查方法,再判断与初始容量大小,计算modCount,是否需要扩容,最后赋值给底层元素

每次add 容量都会加1,同时会判断是否需要扩容。

ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍。

无一例外,只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性。当执行synchronized修饰的方法前,系统会对该方法加一把锁,方法执行完成后释放锁,加锁和释放锁的这个过程,在系统中是有开销的,因此,在单线程的环境中,Vector效率要差很多。(多线程环境不允许用ArrayList,需要做处理)

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值