欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

底层ArrayList的简单模拟实现

程序员文章站 2022-04-18 18:36:03
...

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

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;
    }
}

相关标签: java arraylist