Vector
前言
Github:https://github.com/HealerJean
1、Vector
使用了大量的
synchronized
来保证安全性
1.1、类结构
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
1.1、无参构造器
直接就初始化了数组的大小为10,而ArrayList如果是无参构造器初始化是在扩容的时候
public Vector() {
this(10);
}
1.2、指定大小的构造器
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
1.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;
}
1.4、add(E e)和grow扩容
1.4.1、add
使用
synchronized
,来保证安全性
public synchronized boolean add(E e) {
modCount++;
//确保elementData数组有合适的大小,当容量不够时进行扩容,,表示需要size + 1个空间容量
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
//确保elementData数组有合适的大小,当容量不够时进行扩容,,表示需要size + 1个空间容量
private void ensureCapacityHelper(int minCapacity) {
//容量不够用了,要扩容 (同时包含初始化数组,空数组的时候elementData.length == 0,)
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
1.4.2、grow
如果我们指定了扩容累加的长度,则使用累加的长度,否则等于旧的容量乘以2
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//如果我们指定了扩容累加的长度,则使用累加的长度,否则等于旧的容量乘以2
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
//最少需要的容量比 新计算出来的容量还要打。)我们这个时候要使用期望的最小容量作为新的容量
//情况1:无参构造器,数组初始化,
//情况2:指定容量为1
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//如果通过上面计算出来的容量,比数组允许的最大容量还要大,那肯定不行的。所以要根据实际需要的最小容量来减少,调用hugeCapacity重新获取新的容量
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
/**
* 取得最大容量
*/
private static int hugeCapacity(int minCapacity) {
//数组的长度已经超过Integer.MAX_VALUE ,再加1就会变成负数 溢出
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
//取最大容量 加入最少需要的容量比数组的最大容量还要大,Integer的最大值作为新的数组容量,否则就返回,数组最大容量
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
1.5、remove(int index)
使用
synchronized
保证线程安全1、检查索引位置是否越界
2、定位元素,放入新的元素,返回旧的元素。然后重新移动数组
public synchronized E remove(int index) {
modCount++;
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
E oldValue = elementData(index);
int numMoved = elementCount - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--elementCount] = null; // Let gc do its work
return oldValue;
}