Java集合的 Vector底层讲解

Vector作为List的另外一个典型的实现类,完全支持List的全部功能,Vector的实现其实和ArrayList的底层实现很类似,都是封装了一个Object[],但Vector是一个比较古老的集合,JDK1.0就已经存在,建议不要使用这个集合,Vector与ArrayList的主要区别是:Vector是线程安全的,ArrayList是非线程安全的,但性能上Vector比ArrayList低。

基本属性

protected Object[] elementData;  //存放元素的数组
protected int elementCount;    //已经放入数组的元素个数
protected int capacityIncrement; //数组的增长系数

源码解析

package java.util;public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {//定义数组,存放元素protected Object[] elementData;//已经放入数组的元素数量protected int elementCount;//增长的系数protected int capacityIncrement;//可序列化版本号private static final long serialVersionUID = -2767605614048989439L;//构造方法,提供初始大小,和增长系数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);}//构造方法,将指定的集合元素转化为Vectorpublic Vector(Collection<? extends E> c) {elementData = c.toArray();elementCount = elementData.length;// c.toArray might (incorrectly) not return Object[] (see 6260652)//判断c.toArray是否是Object[]类型if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, elementCount, Object[].class);}//将elementData中的元素全部拷贝到anArray数组中public synchronized void copyInto(Object[] anArray) {System.arraycopy(elementData, 0, anArray, 0, elementCount);}//将数组长度设置为等于vector的个数public synchronized void trimToSize() {modCount++;int oldCapacity = elementData.length;if (elementCount < oldCapacity) {elementData = Arrays.copyOf(elementData, elementCount);}}//扩充容量public synchronized void ensureCapacity(int minCapacity) {if (minCapacity > 0) {modCount++;ensureCapacityHelper(minCapacity);}}//扩充容量帮助函数private void ensureCapacityHelper(int minCapacity) {// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}//最大容量private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//扩充容量执行方法private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;//根据capacityIncrement进行判断,capacityIncrement> 0 增加capacityIncrement个容量,否则容量扩充当前容量的一倍int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);//扩容操作,生成已给新的数组,容量为newCapacity,并将elementData中的元素全部拷贝到新数组中,并将新生成的数组在赋值给elementData elementData = Arrays.copyOf(elementData, newCapacity);}}

总结
Vector和ArrayList的底层实现方式非常的相近,官方说少使用Vector,还是尽量少使用,通过源码可以看出,每个方法都添加了synchronized关键字来保证同步,所以它是线程安全的,但是正是这些方法的同步,让其效率大大的降低了。比ArrayList的效率要慢

因此,给出以下几点总结:
1、Vector有四个不同的构造函数。 无参构造的容量默认值为10
2、扩充容量的方法ensureCapacityHelper。与ArrayList不同的是,Vector在每次增加元素(可能是1个,也可能是一组)时,都要调用该方法来确保足够的容量。当容量不足以容纳当前的元素个数时,就看构造方法中传入的容量增长系数CapacityIncrement是否为0,如果不为0,就设置新的容量为 旧容量 + 容量增长量;如果为0,设置新的容量为旧的容量的2倍,如果设置后的容量还不够,则直接新的容量设置为 旧容量 + 传入参数所需要的容量 而后同样用Arrays.copyof()方法将元素拷贝到新的数组。
3、很多方法都加入了synchronized同步语句,来确保线程安全。
4、Vector在查找给定元素索引值等方法中,源码都将该元素的值分为null和不为null两种情况处理,Vector中允许元素为null
5、其他很多地方与ArrayList实现大同小异,Vector现在已经不再使用。

Java集合 Vector的底层详解相关推荐

  1. Java集合框架源码详解系列(一)

     写在前面:大家好!我是晴空๓.如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教.我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/.非常 ...

  2. java集合for循环_详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...

  3. Java集合篇:ArrayList详解

    一.ArrayList概述: ArrayList是实现了List接口的动态数组,所谓动态数组就是他的大小是可变的.实现了所有可选列表操作,并允许包括Null在内的所有元素.除了实现 List 接口外, ...

  4. JAVA集合Set之HashSet详解_Java基础———集合之HashSet详解

    1.HashSet简介 Set是一个继承于Collection的接口,即Set也是集合中的一种.Set是没有重复元素的集合. HashSet是Set接口典型实现,它按照Hash算法来存储集合中的元素, ...

  5. Java集合篇:ConcurrentHashMap详解(JDK1.8)

    (本文使用的源码都是基于JDK1.8的) (基于JDK1.6的版本可以参考这篇文章:https://blog.csdn.net/a745233700/article/details/83120464) ...

  6. Java集合篇:ConcurrentHashMap详解(JDK1.6)

    (本文有关ConcurrentHashMap的源码都是基于JDK1.6的) (基于JDK1.8的版本可以参考这篇文章:https://blog.csdn.net/a745233700/article/ ...

  7. JAVA集合Set之HashSet详解

    HashSet这个类实现了Set集合,实际为一个HashMap的实例.对集合的迭代次序没有任何保证; 特别是,它不能保证订单会随着时间的推移保持不变.这个类允许null 元素. 并且HashSet提供 ...

  8. Vector的使用详解

    Java中 Vector的使用详解 Vector 可实现自动增长的对象数组.  java.util.vector提供了向量类(Vector)以实现类似动态数组的功能.  创建了一个向量类的对象后,可以 ...

  9. (7)Java数据结构--集合map,set,list详解

    MAP,SET,LIST,等JAVA中集合解析(了解) - clam_clam的专栏 - CSDN博---有颜色, http://blog.csdn.net/clam_clam/article/det ...

最新文章

  1. golang 同一个包中函数互相调用报错 undefined 以及在 VSCode 中配置右键执行整个包文件
  2. Linux shell日常使用
  3. 四则运算c语言编程分支结构,C语言之分支结构(二)
  4. 第五周项目一-三角形类雏形(4)
  5. PHP中把stdClass Object转array的几个方法
  6. Linux安装python3.6.3
  7. python发送短信接口_python发送短信和发送邮件
  8. ZOJ 1048|POJ 1004|HDU1064 Financial Management
  9. 【数据结构与算法】【算法思想】【推荐系统】向量空间
  10. 并发的线程入门到并发安全原理解析,offer拿到手软
  11. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存
  12. Javascript:闭包、面向对象、构造函数
  13. 最近win7更新后出现第二次打开IDE(delphi2007)的时候提示无法打开EditorLineEnds.ttr这个文件...
  14. input file类型单个文件上传formData
  15. android设置透明主题后背景为黑色,android – 活动应该是透明的,但有黑色背景
  16. Adaptive调度器
  17. php exec 命令,概述PHP命令行shell_exec()使用
  18. 如何做到3个月吸粉10多万
  19. latex 调整图片大小
  20. Hypothesis Test Overview

热门文章

  1. 结合iconworkshop,创建ribbon界面
  2. java计算机毕业设计桌游店会员管理系统源码+数据库+系统+lw文档
  3. mysql 聚合函数
  4. ISAKMP报文解密
  5. mysql的访问端口是什么意思_数据库端口是什么端口号
  6. 影像增强器结构及原理
  7. 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)
  8. 关于qt qpixmap qimage 无法正常加载jpg格式图片问题(坑啊)
  9. 担心自己和对象的未来怎么办_别担心,要开心:如何通过5个简单的步骤来建立自己的未来技术职业。...
  10. 利用C语言代码实现三子棋游戏