ArrayList的扩容:
为什么在if()后面要进行一个Math.max的操作?既然elementDat数组已经为null了,那DEFAULT_CAPACITY就一定比minCapacity小呀,minCapacity不就是1吗,而DEFAULT_CAPACITY是10,直接就返回DEFAULT_CAPACITY不就好了,为什么还要进行比较呢?
看一下这个方法有哪些地方调用,minCapacity会不会传其它值
minCapacity是函数的参数,不一定是1
DEFAULT_CAPACITY是额外定义的,虽然可能是10,不排除以后会修改(也许后来一直也不会修改了)
编写代码的时候,要考虑到未来。
private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { // 获取默认的容量和传入参数的较大值 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); }
问答:
Q: Java ArrayList的扩容机制中,为什么在进行扩容前会先进行一个Math.max操作? A: 这是为了保证底层数组的默认长度为10,如果要添加的元素个数比10大,就会在add方法前调用ensureCapacityInternal方法,其中会先将minCapacity赋值为Math.max(DEFAULT_CAPACITY, minCapacity),即将minCapacity设置为10和待添加元素个数中较大的值,这样就保证了底层数组的长度最少为10,再进行扩容的时候就不会出现长度为0的情况了。
具体的流程是这样的: 1. 第一次添加元素时,为了保证底层数组有足够的空间,先将minCapacity赋值为1。 2. 在add方法中调用ensureCapacityInternal方法,其中先将minCapacity赋值为Math.max(DEFAULT_CAPACITY, minCapacity),即10和1中较大的值,此时minCapacity被设置为10。 3. 如果元素个数大于10,则会在add方法执行前进行扩容。
具体的代码见下:
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { // 第一次添加元素
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); // 确定底层数组的默认长度为10
}
ensureExplicitCapacity(minCapacity);
}
public boolean add(E e) {
ensureCapacityInternal(size + 1); // 确保底层数组有足够的容量
elementData[size++] = e; // 添加元素
return true;
}