Java集合(四)Vector底层结构
文章目录
一、Vector类的基本介绍
1.1、Vector类的定义说明
List接口的实现子类
1.2、Vector类底层
Vector底层也是Object数组
1.3、Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized(在开发中,需要线程同步安全时,考虑使用Vector)
二、Vector和ArrayList的比较
2.1、Vector和ArrayList的比较
1、ArrayList是List的主要实现类,底层使用Object[]存储,适用于频繁的查找工作,线程不安全
2、Vector是List的古老实现类,底层使用的Object[],线程安全的,效率不高。
三、Vector底层源码
如果是无参构造器,大小默认为10
执行到add()方法时,它也会对数值进行一个装箱
然后再执行add()方法
ensureCapaciryHelper()
此时参入的数值 minCapacity为1 减去elementData的长度(上面无参构造默认为10)不大于0
所以不会执行grow()方法进行扩容
执行完上面这个方法返回到add方法,会把参入的数值 直接存入下标为0的位置
可以看到for循环的vector集合
这里我for循环了15次 已知new Vector()默认大小为10 当第11次添加会执行扩容
下面minCapacity=11 往下走 11-默认大小10 > 0 执行grow()扩容方法
进入到grow方法计算分配大小
int newCapacity = oldCapacity + 三元运算符(capacityIncrement >0)? capacityIncrement :oldCapacity
(capacityIncrement >0)? capacityIncrement :oldCapacity 也就是 0 > 0 ? 0 : 10 结果可想而知为 10
int newCapacity = oldCapacity + (capacityIncrement >0)? capacityIncrement :oldCapacity 10 + 10 20
扩容完毕 大小为 10 的 2倍 20
可以看到 Vectoe集合扩容完毕 大小为20 11 也添加到了下标为10的位置
有参构造 给定的数值为8
往下运行 看看扩容机制
执行了第九次 而数组长度为 8 所以 这个 if语句成立 执行扩容grow方法
看,这个newCapacity = 16 也就 有参构造传入大小 8 的 二倍