private static int calculateCapacity(Object[] elementData, int minCapacity) {
//默许初始化时elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA
// 此处前往默许容量DEFAULT_CAPACITY,此值大小为10
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
//反省能否扩容,假设以后容量大于数组长度停止扩容
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//依据原来数据长度停止扩容
//oldCapacity >> 1 位运算相当于 oldCapacity=oldCapacity/2
//新容量为 newCapacity = oldCapacity + (oldCapacity >> 1);即为原来的1.5倍
//将老数组中的数据移动到新数组中
//此处解释下为何为1.5倍,这是一种折中是对扩容次数和空间大小的折中,假设扩容次数太多会降低效率假设空间太大会糜费空间
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
成绩二:数据遍历,fast-fail,迭代器删除为什么不越界
在如下代码注释中将找到答案
ArrayList 遍历支持for,foreach,迭代器遍历
fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容停止操作时,就能够会产生fail-fast事情。
例如:当某一个线程A经过iterator去遍历某集合的进程中,若该集合的内容被其他线程所改动了;那么线程A拜访集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事情。
//ArrayList 迭代器是经过两个游标数组的下标
private class Itr implements Iterator<E> { // 代表下一个元素的游标
int cursor; // index of next element to return
(责任编辑:admin)