动态数组 06 扩容 & 缩容

动态数组

数组的容量可以动态伸缩,当新元素装不下时,就把数组的容量扩大;当元素太少时,就把数组容量缩小;扩容和缩容的实现是通过新建一个更大或更小的数组,把现有数组复制到新数组中,并用新数组代替现有数组。

扩容

  • 扩容的策略是:添加元素时,如果容量已满,就将容量扩大一倍;
// 在index索引的位置插入一个新元素e
public void add(int index, E e){

    if(index < 0 || index > size)
        throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size.");

    if(size == data.length)
        resize(2 * data.length);

    for(int i = size - 1; i >= index ; i --)
        data[i + 1] = data[i];

    data[index] = e;

    size ++;
}

// 将数组空间的容量变成newCapacity大小
private void resize(int newCapacity){
    E[] newData = (E[])new Object[newCapacity];
    for(int i = 0 ; i < size ; i ++)
        newData[i] = data[i];
    data = newData;
}

缩容

  • 缩容的策略是:删除元素后,如果元素个数是容量一半时,将容量缩小一半;
// 从数组中删除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 / 2)
        resize(data.length / 2);
    return ret;
}

存在的问题

由于扩容和缩容的因子都是1/2,会出现当在1/2处交替扩容缩容时,都要进行复制操作;解决方案是,把缩容的因子调整为1/4,即当元素的个数为容量的1/4时,将容量索为1/2,由eager变为lazy;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值