//默认初始化容量
private static final int DEFAULT_CAPACITY = 10;
//添加元素有可能会触发扩容,效率较低
public boolean add(E e) {
//进行写操作之前让Size+1再检查底层数组容量是否可用,同时modCount++
ensureCapacityInternal(size + 1);
elementData[size++] = e;//检查通过后,再添加元素到数组
return true;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;//该集合被修改得次数加1
if (minCapacity - elementData.length > 0)
grow(minCapacity);//如果给定得容量大于底层数组的容量,就进行扩容
}
//扩容方法
private void grow(int minCapacity) {
// overflow-conscious code
//先拿旧数组容量
int oldCapacity = elementData.length;
//在旧容量的基础上扩容百分之50,得到新容量
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
//计算出来的新容量如果小于给定容量就让新容量指向给定容量
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
//如果新容量大于Integer.MAX_VALUE-8,就让新容量指向 Integer.MAX_VALUE
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
加载因子的作用在于判断map是否需要扩容,而扩容是一个比较耗时的操作。