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无疑是最佳选择,因为它的实现已经考虑了线程安全的问题。

最新文章

  1. Sass:初识Sass与Koala工具的使用
  2. [nRF51822] 10、基础实验代码解析大全 &#183; 实验15 - RTC
  3. ORA-00245: control file backup failed; target is likely on a local file system
  4. 《UML大战需求分析》阅读笔记2
  5. 修改list中附件排序(sharepoint 2010)
  6. css3 变形(transform)、转换(transition)和动画(animation)
  7. vi 编辑内容中查找字符位置
  8. 《编写高质量代码—改善java程序的151个建议》知识整理一
  9. Hive sql 语法解读
  10. Django 入门
  11. 优化MYSQL FILESORT
  12. [置顶] 数据持久层(DAO)常用功能–通用API的实现
  13. apache启动报错:the requested operation has failed解决办法
  14. flask中使用xlsxwriter导出excel文件
  15. Linux下C语言的调试 - gdb
  16. [Leetcode]643. Maximum Average Subarray I
  17. Laravel用post提交表单常见的两个错误
  18. Python实现机器学习算法:EM算法
  19. 记录Git的安装过程
  20. 算法练习-002-返回一个set数组

热门文章

  1. java并发api总结
  2. Android 报错 Error:(303, 27) 错误: 找不到符号 符号: 方法 sin(float) 位置: 类 FloatMath
  3. 栈溢出笔记1.9 认识SEH
  4. [NPM] Run npm scripts with git hooks
  5. mysql创建应用账号
  6. luogu 3939 数颜色 - STL(vector)
  7. 【t042】炮击坦克
  8. 【u229】独木桥
  9. Graphics-Processing Architecture Based on Approximate Rendering
  10. 【BZOJ 1016】[JSOI2008]最小生成树计数(搜索+克鲁斯卡尔)