底层ArrayList的简单模拟实现

模拟底层动态数组的简单实现
由于静态数组的长度一旦初始化就无法改变,这就容易导致栈溢出,我们想要增加数据的时候修改就会过于繁琐。动态数组的出现是我们更容易对已有的数组进行 增,删,改,查 操作。

public class YcList {

    private Object[] data;//定义对象数组
    private int length;//数组实际的存储个数


    //用无参构造器初始化数组长度默认为10
    public YcList(){
        this.data=new Object[10];
        this.length=0;
    }

    //用有参构造器初始化数组长度,有构造器实参决定数组长度
    public YcList(int instance){
        this.data=new Object[instance];
        this.length=0;
    }

    //扩容
    public void add(Object x){
        if(  length== ( (int)(data.length*0.8) )){
            expansion();
        }
        data[length]=x;
        length++;
    }

    //指定位置的火绒操作
    public void insertAdd(int index,Object x){
        if(index<0 || index>length){
            throw new RuntimeException("指定索引有误");
        }
        if(  length== ( (int)(data.length*0.8) )){//留有缓冲量,数组满80%的时候扩容
            expansion();
        }
        System.arraycopy(data,index-1,data,index,length-index);
        data[--index]=x;
        length++;

    }
    //扩容操作
    private void expansion() {
        Object[] newData=new Object[(int)(data.length*1.5)];//创建一个数组是原来的1.5倍
        System.arraycopy(data,0,newData,0,data.length);//将原数组复制到新数组中
        data=newData;//新数组赋值给原数组
        //垃圾回收机制
        System.gc();
    }
    //删除操作
    public Object remove(int index){
        if(index<0 || index>=length){//判断索引是否在数组中
            throw new RuntimeException("索引越界");
        }
        Object obj=data[index];
        System.arraycopy(data,index+1,data,index,length-index-1);
        length--;
        return obj;
    }
    //获取指定位置的元素
    public Object get(int index){
        if(index<0 || index>=length){
            throw new RuntimeException("指定位置不存在");
        }
        Object obj=data[index];
        return obj;
    }
    //清空操作
    public Object[] clear(){
        Object[] data=new Object[10];
        length=0;
        return data;
    }

    //返回元素个数
    public int size(){
        return length;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值