在Java中,ArrayList是一种非常频繁的收集类型。底层是对象阵列,因此它具有数组的特征,例如支持随机访问,因此查询效率很高,但是插入的数据需要移动元素,因此效率很低,因此效率很低,因此效率很低。很低,因此效率很低,因此效率很低。
让我们看一下如果您称ArrayList的非CIN皮革构造函数将会发生什么?
在建设性方法中,它将DefaultCapacity_empty_elementdata分配给ElementData。此DefaultCapacity_empty_elementData是一个空对象数组,elementData是ArrayList的实际容器。
可以看出,在调用非构造符时,ArrayList会创建一个长度为0的空数组。当添加add()方法添加元素时,arraylist将触发扩展机制:
add()方法的第一行是执行扩展过程:
该方法将首先计算容量的能力:
初始元素数据是一个空数组,已建立。它将选择一个最大值以从default_capacity和mincapacity返回。Default_capacity表示默认的初始容量。它的值为10:
MinCapacity通过add()方法传递,并且值为size + 1:
因此,计算能力()方法将返回10,然后致电SuseExpliclIctCapacity()方法:
首先,让ModCount ++,它是用于记录修改数组数量的变量。我们不关心它。目前,MinCapacity的值为10,元素Data.length的值为0,确定条件并执行GRAW()方法:
注意此行代码:
首先将旧容量移至右边,再加上旧容量,并获得新的容量。正确的运动的正确运动等于除2和基于此基础上添加旧容量。第二次扩展是旧容量的旧容量的1.5倍。最后,调用arrays.copyof()方法复制它,而elementData则指向新数组。旧数组将很快被垃圾收集器回收,因为它没有引用它。
当add()方法被称为第二次时,该程序仍然需要达到扩展方法:
但是此时,元素data不再是一个空数组,因此直接返回当前大小 + 1,即:2
因为如果无法确定判断,并且不会发生扩展。
添加11个元素时,ArrayList应触发第二个扩展以查看源代码:
MinCapacity的价值为11,然后称其为:
目前,较小能力的值大于元素data的长度,并建立条件以触发扩展机制:
将原始容量10移至获得5的权利,再加上原始容量10获得15,因此新阵列的容量为15,最后复制阵列并扩大容量。
第三次阵列列表之后的容量是什么?我们知道新容量必须是旧容量的1.5倍,这是新容量22或23吗?因此,如果您只知道新容量是旧容量的1.5倍能力,您无法知道这个问题。实际上,阵列列表的底层是通过位移操作获得的新容量。因此,新容量应相等。结果,第三个扩展后的阵列列表的容量为22。
但是,在Addall()方法中,容量扩展机制将发生变化,例如:
执行Addall()方法后,ArrayList的容量应该是什么?是15?看一下源代码:
它将调用nesurecatiacity()方法的扩展方法,并将其传递到size + Numnew = 11:
由于初始元素数据是一个空数阵列,它符合条件,因此它将在default_capacity和mincapacity中返回较大的阵列。结果,MinCapacity很大,因此它返回11,这导致阵列列表的能力执行Addall()方法11的容量。
Addall()方法始终选择容量和旧容量的最大值,以及添加元素作为新容量的数量,例如:当前阵列列表中有10个元素,并且Addall()方法需要需要6个元素。当ArrayList触发扩展时,新容量应为15,而旧容量加上需要添加的元素容量为16,较大的值为16,因此新容量应为16。