ArrayList 主要集成了List接口,我们还是从我们经常使用来看,这种集合类之所以好用,有一部分原因是我们不必像数组那样, 初始化必须指明了大小。比如 List list=new ArrayList<>();
elementData 属于Object[] 默认置空。也不会做任何操作。
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
主要分析add和get操作。
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
//赋值进去。
elementData[size++] = e;
return true;
}
//初始化的时候实际上size为0.
private void ensureCapacityInternal(int minCapacity) {
//跟10比较,选择比较小的那个。等于说小于10的容量选择此容量,大于10的容量就选择10的容量。
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
关键是grow方法,进来分析下。
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//扩容,oldCapacity 的3倍了。
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//超过最大的容量。这个容量 Integer.MAX_VALUE - 8;已经超级巨大了。
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);
}
//此操作也是非常简单的。
public E get(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
return (E) elementData[index];
}
//现在有个问题。HashMap也是利用了 数组作为基础的数据结构,那么HashMap是否也可以利用二维数组去描述呢?