动态数组 07 避免复杂度震荡

什么是复杂度震荡

由于扩容和缩容的因子都是 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;
}

你可能感兴趣的:(动态数组 07 避免复杂度震荡)