ArrayList 和 Vector 的区别
- ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
- Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢
两者的对比:
| ArrayList | Vector |
|---|---|
| 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,需要做处理)
本文探讨了ArrayList和Vector这两个ArrayList实现类的区别。ArrayList提供快速的随机访问,但在中间插入和删除元素时效率较低,适合遍历和查找。Vector则支持线程同步,保证了多线程环境下的安全性,但同步操作导致其性能低于ArrayList。ArrayList在容量不足时扩展为原容量的1.5倍,而Vector扩展为原容量的2倍。在单线程环境下,推荐使用ArrayList以提高性能。
872

被折叠的 条评论
为什么被折叠?



