文章目录
ArrayList和Vector对比:
底层数据结构
构造方法
扩容机制
添加元素
删除元素
查询
迭代器
本来今天是想看一下Stack的源码的,但是在看到Stack的父类结构时
我想到了我之前还没怎么看过Vector的源码,甚至乎还很少用,我之前对他的了解大概就是停留在跟ArrayList很相似,是线程安全的ArrayList,先总结下ArrayList和Vector的不同之处,然后带着结论去看源码,找原因
ArrayList源码分析
ArrayList和Vector对比:
相同之处:
都是基于数组
都支持随机访问
都支持动态扩容
都支持fail—fast机制
不同之处:
Vector历史比ArrayList久远,Vector是jdk1.0,ArrayList是jdk1.2
Vector是线程安全的,ArrayList线程不安全
Vector动态扩容默认扩容两倍,ArrayList是1.5倍
底层数据结构
Vector底层是基于数组实现的
elementData
ArrayList底层数据结构也是数组
其他相关属性
elementCount
capacityIncrement
构造方法
无参构造,数组容量默认是10
ArrayList默认数组容量也是10
DEFAULT_CAPACITY
elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA
Vcetor其他构造方法:
指定容量和增长量构造
initialCapacity capacityIncrement
initialCapacity
initialCapacity
elementData initialCapacity
capacityIncrement capacityIncrement
指定容量和增长量为0的构造:
initialCapacity initialCapacity
传入指定集合构造
c elementData c
elementCount elementDatalength
elementData
elementData elementData elementCount
扩容机制
在了解添加元素之前我们需要理清Vector的扩容机制是怎样的,其实跟ArrayList的扩容机制也很相似
1.计算最小容量:
最小容量 = 当前数组元素数量 + 1,此举的目的就是判断是否需要扩容,最小容量就是相当于成功添加了一个元素后的新的数组元素数量,如果这个新的数组元素数量大于数组长度,那么肯定需要扩容
minCapacity minCapacity elementDatalength
minCapacity
2.传入最小容量开始扩容:
如果当前数组的增长量 > 0则新数组容量 = 旧数组容量 + 增长量
否则,则新数组容量 = 2 * 旧数组容量
求出新数组容量后,如果新数组容量 < 最小容量,那么新数组容量 = 最小容量
如果新数组容量 > 最大数组容量,则新数组容量 = 整数最大值
elementData
0
4.扩容实际:数组复制和移动
elementData
1
ArrayList的扩容机制其实和Vector很相似,至少原理是一致的,但是在扩容大小上不一样
因为ArrayList没有增长量这一概念,所以ArrayList默认扩容1.5倍
elementData
2
ArrayList扩容流程:
添加元素
数组尾部添加指定元素
可以看到添加方法上带有synchronized同步关键字,保证了在添加元素时的线程安全,但是也会带来获取锁和释放锁的效率问题
elementData
3
指定位置添加指定元素
elementData
4
添加指定集合
elementData
5
删除元素
删除指定下标元素
elementData
6
删除指定元素
elementData
7
删除所有元素
elementData
8
删除指定范围的元素
elementData
9
查询
从指定下标开始找到指定元素第一次出现的下标
从前往后找
0
从后往前找
1
返回指定下标的元素
2
是否包含指定元素
3
迭代器
迭代器和ArrayList相比是差不多的,包括实现也是,可以参考ArrayList源码分析
还没有评论,来说两句吧...