java.util.Vector源码解析
来源:互联网 发布:mac os 系统修复 编辑:程序博客网 时间:2024/05/16 15:21
1.java集合框架图
2.所属包
package java.util;
3.继承与实现关系
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
4.准备知识
Vector集合实际上是实现了动态数组的方式,是可以随着向量元素的增加可以动态增长。实际上就是一种动态顺序表的应用。
5.属性
/** * Object类型的数组,用来存储实际数据 */ protected Object[] elementData; /** * 代表向量中元素的个数 */ protected int elementCount; /** * 向量的增长因数 * 当向量的容量大于其容量时,向量的容量自动递增的量。 * 如果容量增量小于或等于零,则每次需要增长时,向量的容量增加一倍。 */ protected int capacityIncrement;
6.构造方法
/** 构造方法1 * 输入参数为初始化容量和增量参数的构造方法 */ public Vector(int initialCapacity, int capacityIncrement) { super();//如果向量初始化容量小于0,那么就报非法参数异常的错误。 if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);//将初始化容量的长度作为Object数组实际长度 this.elementData = new Object[initialCapacity];//初始化增量参数 this.capacityIncrement = capacityIncrement; }
/** 构造方法2 * 使用指定的初始容量和等于零的容量增量构造一个空向量 */ public Vector(int initialCapacity) { this(initialCapacity, 0); }
/** 构造方法3 * 构造一个初始化容量为10,增量为0的向量 */ public Vector() { this(10); }
/** 构造方法4 * 构造一个包含指定集合中的元素的向量,这些元素按其集合的迭代器返回元素的顺序排列。 */ public Vector(Collection<? extends E> c) {//将集合Collection转化为Object数组elementData。如果c为空,那么就会报空指针异常 elementData = c.toArray(); elementCount = elementData.length; //将c中的元素拷贝到elementData中 if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, elementCount, Object[].class); }
7.方法
ensureCapacity方法:扩充容量
/** * 增加此向量的容量(如有必要),以确保其至少能够保存最小容量参数指定的组件数。 * 如果当前数组的容量小于minCapacity,那么就增加容量,增加数组长度 * 新数组的长度等于原数组的长度加上增量capacityIncrement。 * 如果增加capacityIncrement小于等于0,那么就自动扩增为原来二倍。 * 如果扩增为原来的二倍还是比minCapacity小,那么就将minCapacity作为Object数组的长度。 */ public synchronized void ensureCapacity(int minCapacity) { if (minCapacity > 0) { modCount++; ensureCapacityHelper(minCapacity); } }
private void ensureCapacityHelper(int minCapacity) { //minCapacity为实际向量中的元素需要的容量,如果minCapacity大于当前数组长度,那么就进行扩容 if (minCapacity - elementData.length > 0) grow(minCapacity); }
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; private void grow(int minCapacity) { //oldCapacity旧容量是Object数组的长度 int oldCapacity = elementData.length;//如果增量capacityIncrement大于0,那么新容量为旧容量加上增量,否则为旧容量的2倍 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); } private static int hugeCapacity(int minCapacity) {//如果实际需要的容量小于0就抛出异常 if (minCapacity < 0) throw new OutOfMemoryError();//实际容量如果比最大容量还大,那么实际容量为Integer.MAX_VALUE,否则为Integer.MAX_VALUE - 8 return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }add方法
/** * 采用同步的方式往向量中添加元素e */ public synchronized boolean add(E e) { modCount++;//由于添加元素需要动态的扩容,所以调用ensureCapacityHelper方法,长度要增长1 ensureCapacityHelper(elementCount + 1);//这步采用顺序表添加元素的模板代码,赋值长度加1 elementData[elementCount++] = e; return true; }
---------------------------该源码为jdk1.7版本的
阅读全文
0 0
- java.util.Vector源码解析
- java.util.logging源码解析
- java.util.ArrayList源码解析
- java.util.LinkedList源码解析
- java.util.Stack源码解析
- java.util.HashSet源码解析
- java.util.HashMap源码解析
- java.util.Hashtable源码解析
- java.util.LinkedHashMap源码解析
- java.util.ArrayDeque源码解析
- java.util.TreeMap源码解析
- java.util.ArrayList源码解析
- JAVA 集合类(java.util)源码阅读笔记------Vector
- 【jdk源码解析三】java.util.Hashtable
- 解析java.util集合类源码(SubList)
- 解析java.util集合类源码(ArrayList)
- 解析java.util集合类源码(AbstractSequentialList)
- 解析java.util集合类源码(Queue)
- opendaylight源码下载方式
- aSimpleCache初识
- c++ primer(一)
- 如何解决MongoDB启动时无法连接到Upstart的错误
- redhat nginx搭建文件服务器
- java.util.Vector源码解析
- win7下计算机属性打不开
- tensorflow AttributeError: 'module' object has no attribute 'cpu_count'
- mac安装maven
- java中queue的使用
- MVC,MVP 和 MVVM
- css中的BFC
- 快速排序
- Alamofire进行网络请求(实训)