(注意:本文基于JDK1.8)
前言
Vector是线程安全的动态数组类,提供4个创建Vector对象的构造方法,接下来我们逐个分析每个创建Vector对象的构造方法
构造方法Vector()分析
public Vector() { this(10); }
用于创建Vector对象的默认构造方法,此构造方法的内部会将数字10传入到1个参数的构造方法中,数字10代表的是Vector对象持有的底层数组对象的容量
构造方法Vector(int)分析
public Vector(int initialCapacity) { this(initialCapacity, 0); }
创建Vector对象时可以指定底层数组的容量,传入的int参数表示数组容量,该构造方法的内部会将传入的initialCapacity和一个数字0,又传入到2个参数的构造方法中,这个数字0代表什么呢?继续往下看……
构造方法Vecotor(int,int)分析
public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement; }
创建Vector对象的构造方法,可以指定数组默认容量、指定数组的增量值,传入的参数initialCapacity表示数组默认容量,传入的参数capacityIncrement即表示增量
1、首先调用基类的无参构造方法(子类必须至少调用一个基类的构造方法)
2、检查数组的初始化容量值
如果initialCapacity小于0,则抛出一个IllegalArgumentException对象,IllegalArgumentException对象接受一个字符串对象,这个字符串对象会告知我们发生异常的原因
3、创建一个Object数组对象(容量为initialCapacity值),由Vector对象持有的实例变量elementData负责保存该对象的引用,这个elementData保存的数组对象,就是Vector实现存储元素的底层数组对象
4、为Vector对象持有的实例变量capacityIncrement进行赋值,为其赋的值是传入的局部变量capacityIncrement
这个capacityIncrement有什么用途呢?原来这个值表示数组扩充容量时的增量,比如现有数组的容量为10,如果扩充增量为5,则下次扩充的容量为15
构造方法Vector(Collection)分析
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); }
用于创建Vector对象的构造方法,传入的Collection对象持有的元素类型必须是类型参数E或者类型参数E的子类,说明必须与当前Vector对象持有的元素类型保持一致
1、首先将Collection对象转换为数组对象,toArray()方法返回的Object数组对象由Vector对象持有的elementData负责保存
2、取出elementData持有的数组对象的长度赋值给Vector对象持有的elementCount
3、当elementData对象的类型不是Object数组对象,则通过Arrays.copyof方法做一次复制与转换,仍然把转换后的Object数组对象由Vector对象持有的elementData负责保存
重要字段介绍(不含基类中定义的字段)
3个实例变量,创建对象时进行初始化
capacityIncrement
:表示Vector对象持有的数组进行扩容时的增量
elementCount
:表示Vector对象持有实际元素总数
elementData
:表示Vector对象持有的数组对象,该数组实际负责持有元素
2个静态变量,类加载时进行初始化
MAX_ARRAY_SIZE
:整型常量,存储了int最大值-8的一个值
serialVersionUID
:long类型常量,用于Vector对象序列化。在不同的JDK版本中区分是否为同一个Vector类
以上就是对于java中Vector源码原理分析的详细内容,更多关于java中Vector源码分析的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/cadi2011/article/details/106592728