ArrayList底层原理
Posted 陕西五花肉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList底层原理相关的知识,希望对你有一定的参考价值。
add 添加底层源码原理:
ArrayList底层使用的是Java数组来存储集合中的内容,这个数组是Object类型的
elementData的访问级别为包内私有,是为了使内部类能够访问到其中的元素
代码中有个常量,表示数组的默认容量,大小为10:
扩容规则:
最初 10个容量 下来15 22 33 49
下次扩容的 容量=之前容量+他的一半
容量 | 10 | 15 | 22 | 33 | 49 |
---|---|---|---|---|---|
扩容次数 | 1(默认初始) | 2 | 3 | 4 | 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);
}
get
首先判断 index是否在范围内
// 获取元素
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
remove
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved); //
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
set
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
以上是关于ArrayList底层原理的主要内容,如果未能解决你的问题,请参考以下文章