首页 > 其他 > 详细

JDK源码之Vector

时间:2020-09-09 20:37:53      阅读:71      评论:0      收藏:0      [点我收藏+]

下文带/**/为源码注释//为个人注释。源代码使用这个颜色

 

/*存储矢量分量的数组缓冲区。向量的容量是这个数组缓冲区的长度,并且至少足够大来包含向量的所有元素。*/

//存放集合元素的数组

protected Object[] elementData;

/*当矢量的大小大于其容量时,其容量自动增加的数量。如果容量增量小于或等于零,则每次需要增长时,向量的容量就增加一倍。*/

//应该是集合扩容时用到的,它的作用还有待考

protected int capacityIncrement;

//集合的长度,默认是0

protected int elementCount;

/*构造一个空向量,以便其内部数据数组的大小为10,其标准容量增量为零。*/

public Vector() {
this(10);
}

/*构造一个具有指定初始容量且容量增量为零的空向量。*/

public Vector(int initialCapacity) {
this(initialCapacity, 0);
}

/*构造一个具有指定初始容量和容量增量的空向量。*/

public Vector(int initialCapacity, int capacityIncrement) {
super();

//如果初始容量小于0报错
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);

//创建一个容量10的数组
this.elementData = new Object[initialCapacity];

//增量为0
this.capacityIncrement = capacityIncrement;
}

 

/*将指定的元素追加到此向量的末尾。*/

//加锁了

public synchronized boolean add(E e) {
modCount++;

//第一次添加传入参数为elementCount=0 (0+1)

//第二次添加传入参数为elementCount=1 (1+1)

//第三次添加传入参数为elementCount=2 (2+1)

//第四次添加传入参数为elementCount=3 (3+1)

//第五次添加传入参数为elementCount=4 (4+1)

//第六次添加传入参数为elementCount=5 (5+1)

//第七次添加传入参数为elementCount=6 (6+1)

//第八次添加传入参数为elementCount=7 (7+1)

//第九次添加传入参数为elementCount=8 (8+1)

//第十次添加传入参数为elementCount=9 (9+1)

//第十一次添加传入参数为elementCount=10 (10+1)
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}

//集合错误长度这个值是 -2147483649

public static final int MAX_VALUE = 0x7fffffff;

//集合最大长度

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

/*这实现了ensureCapacity的非同步语义。该类中的同步方法可以在内部调用此方法以确保容量,而不会产生额外同步的开销。*/

private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code

//判断是否扩容,初始容器是10第11次添加才会触发扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}

//第11次添加这里传入的值是11

private void grow(int minCapacity) {
// overflow-conscious code

//elementData.length=10
int oldCapacity = elementData.length;

//capacityIncrement>0 false

//newCapactiy=10+10,在这能看出来,如果自己设置了增量

//那么每次扩容则按照增量值为标准

int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);

//什么情况下这里才能<0如果没有传递增量,newCapctiy都是oldCapacity的两倍

//如果传递了,不能是0也不能是负数就算是1那么11-11也不<0
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;

//这里表示如果新的容量大于了阈值这个阈值是Integer.MAX_VALUE - 8;

//到这里newCapacity肯定是正数也就是只有大于MAX_ARRAY_SIZE才是>0
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);

//最后拷贝数组,ArrayList也是这个方法拷贝的,这次进去看看
elementData = Arrays.copyOf(elementData, newCapacity);
}

private static int hugeCapacity(int minCapacity) {

//这个条件不会满足
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();

//如果大于了则是负数其实也是错误的,否则使用最大值MAX_ARRAY_SIZE
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}

//这是Arrays的方法

public static <T> T[] copyOf(T[] original, int newLength) {
return (T[]) copyOf(original, newLength, original.getClass());
}

//三个参数是原数组,扩容长度,数组类型

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")

//判断数组类型是不是Object如果是直接创建一个Object类型的数组

//如果不是则创建一个指定类型的数组,newInstance后边也是本地方法

//最后调用本地方法System.arraycopy。关于这个方法的参数在ArrayList

//中聊过这里不展开说了
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}

JDK源码之Vector

原文:https://www.cnblogs.com/zumengjie/p/13630683.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!