什么是复杂度震荡
由于扩容和缩容的因子都是 1/2,会出现当在 1/2 处交替增删元素时,都要进行 resize 操作;解决方案是,把缩容的因子调整为 1/4,即当元素的个数为容量的 1/4 时,将容量索为 1/2,由 eager 变为 lazy;
代码实现要点
-
size == data.length / 4 && data.length / 2 != 0
缩容创建的新数组的长度不能是 0,(E[])new Object[0]
是不行的; - 当
data.length == 1
时,data.length / 2 == 0
; - 举个栗子:当数组容量为 1,元素个数为 0 时,不缩容;其实这不是关键,不能
(E[])new Object[0]
是关键;
// 从数组中删除index位置的元素, 返回删除的元素
public E remove(int index){
if(index < 0 || index >= size)
throw new IllegalArgumentException("Remove failed. Index is illegal.");
E ret = data[index];
for(int i = index + 1 ; i < size ; i ++)
data[i - 1] = data[i];
size --;
data[size] = null; // loitering objects != memory leak
if(size == data.length / 4 && data.length / 2 != 0)
resize(data.length / 2);
return ret;
}