JDK源码阅读——Vector实现
1 继承结构图
Vector同样继承自AbstractList,与ArrayList、LinedList一样,是List的一种实现
2 数据结构
// 与ArrayList一样,也是使用对象数组保存元素
protected Object[] elementData; // 记录元素的个数
protected int elementCount; // 每次动态扩容时数组长度增长的长度,可在初始化的时候设置
protected int capacityIncrement;
与ArrayList一样,Vector也是使用对象数组记录元素的值,记录数组长度使用elementCount,与ArrayList不一样的是,Vector每次数组扩容的长度可在初始化的时候设置,用变量capacityIncrement记录
3 构造方法
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
} public Vector(int initialCapacity) {
this(initialCapacity, 0);
} public Vector() {
this(10);
} public Vector(Collection<? extends E> c) {
elementData = c.toArray();
elementCount = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
}
如上有四种构造方法,支持无参构造,设定初始长度构造、初始长度和扩容增长长度构造和传入一个Collection对象进行构造。
其余三种构造方法与ArrayList基本一样,只是与ArrayList不一样的是,Vector支持在构造的时候设定每次动态扩容数组长度增长的值,而ArrayList默认每次扩容都是在当前数组长度的基础上增加一般,具体实现如下:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
而Vector如果在初始化的时候不设置这个值得话,每次扩容则在当前数组长度的基础上增加一倍,实现如下
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
4 需要注意的方法
Vector作为List的一种实现,由于其与ArrayList一样使用对象数组来保存元素,所以其提供的方法与ArrayList基本类似,但是所有方法的定义都多了一个关键字synchronized,相信大家已经知道Vector存在的意义了,那么就是Vector是线程安全的。这也是它与ArrayList的根本区别。
这也决定了ArrayList和Vector在使用上的区别。由于ArrayList不考虑线程安全,所以在执行效率上,ArrayList是优于Vector的,所以在不需要考虑线程安全,或者永远都只会有一个线程能访问到List对象时,最好使用ArrayList,而在可能会有多个线层访问同一个List集合时,使用Vector无疑是最佳选择,因为它的实现已经考虑了线程安全的问题。
最新文章
- Sass:初识Sass与Koala工具的使用
- [nRF51822] 10、基础实验代码解析大全 &#183; 实验15 - RTC
- ORA-00245: control file backup failed; target is likely on a local file system
- 《UML大战需求分析》阅读笔记2
- 修改list中附件排序(sharepoint 2010)
- css3 变形(transform)、转换(transition)和动画(animation)
- vi 编辑内容中查找字符位置
- 《编写高质量代码—改善java程序的151个建议》知识整理一
- Hive sql 语法解读
- Django 入门
- 优化MYSQL FILESORT
- [置顶] 数据持久层(DAO)常用功能–通用API的实现
- apache启动报错:the requested operation has failed解决办法
- flask中使用xlsxwriter导出excel文件
- Linux下C语言的调试 - gdb
- [Leetcode]643. Maximum Average Subarray I
- Laravel用post提交表单常见的两个错误
- Python实现机器学习算法:EM算法
- 记录Git的安装过程
- 算法练习-002-返回一个set数组
热门文章
- java并发api总结
- Android 报错 Error:(303, 27) 错误: 找不到符号 符号: 方法 sin(float) 位置: 类 FloatMath
- 栈溢出笔记1.9 认识SEH
- [NPM] Run npm scripts with git hooks
- mysql创建应用账号
- luogu 3939 数颜色 - STL(vector)
- 【t042】炮击坦克
- 【u229】独木桥
- Graphics-Processing Architecture Based on Approximate Rendering
- 【BZOJ 1016】[JSOI2008]最小生成树计数(搜索+克鲁斯卡尔)