云计算百科
云计算领域专业知识百科平台

手写动态数组:扩容与插入的底层逻辑

使用数组存储数据时,需要预先在内存中分配固定空间。传统静态数组的大小是预先确定的,当实际存储的数据量较少时,会造成内存浪费。为解决这一问题,动态数组应运而生。我们以实现自定义动态数组来深入理解这一概念。以下为两种数据类型在栈内存和堆内存中的存储原理。
在这里插入图片描述
基于该示意图,我们来实现动态数组的创建和末尾数据添加功能。

首先初始化数组并分配内存空间:

private int[] arr=new int[0];

初始数组长度为0。后续操作时,会根据需求创建新大小的数组:

  • 以当前arr为模板创建新数组
  • 对新数组执行相应操作
  • 将arr引用指向新数组地址 这样就完成了数组的动态更新,过程如下图所示:
  • //插入数据
    public void insert(int index,int data){
    //新数组扩容
    int[] nArr=new int[arr.length+1];
    nArr[index]=data;
    //原数组复制到新数组
    for(int i=0;i< arr.length;i++){
    if(i<index)
    nArr[i]=arr[i];
    nArr[i+1]=arr[i]; //空出index位置给插入的值
    }
    //更新对象头
    arr=nArr;
    }

    由此,我们可以看出,动态数组相较于普通数组,最大的有点在于长度可以动态变化,支持自动扩容,不需要在创建时固定大小,能够根据数据量灵活增加容量。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 手写动态数组:扩容与插入的底层逻辑
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!