手写ArrayList入门

ArrayList是集合的一种实现,实现了接口List,List接口继承了Collection接口。Collection是所有集合类的父类。ArrayList使用非常广泛,不论是数据库表查询,excel导入解析,还是网站数据爬取都需要使用到,了解ArrayList原理及使用方法显得非常重要。

那么ArrayList是怎么初始化的?

private int index=0; //表示当前有0个,或者要插入的元素地址
    
    private T[] data = (T[]) new Object[10];     //T表示为泛型

这里我们进行初始化,初始大小为10,经过阅读源码private static final int DEFAULT_CAPACITY = 10;我们发现他的初始值为10,所以这里我们也设置为10。

然后我们来实现增加数据的方法,这个时候我们需要考虑到ArrayList的拓容机制,那么它又是怎么拓容的呢?

扩容规则为“数组当前足够的最小容量 + (数组当前足够的最小容量 / 2)”,即数组当前足够的最小容量 * 1.5,当然有最大值的限制。

故我们的增加数据的方法为:

/**
     * 线程不安全
     * 超出索引  怎么解决?拓容
     * @param add
     */
    public void add(T add) {
        //Java内部的拓展机制!!!ArrayList就这样
        if(index>=data.length) {
            T[] datanew=(T[]) new Object[data.length*2];  //这里我们扩容2倍
            for(int i=0;i<data.length;i++) {
                datanew[i]=data[i];
            }
            data=datanew;
        }
        data[index]=add;
        index++;
    }

那么我们要怎么删除呢?这里我们需要考虑到它的初始值,当我们ArrayList的长度小于10时,我们就不能一直的去改变它的长度,我们要一直使用默认长度10

public void del(int index) {
        if(index>=this.index) {
            
        }else {
            this.index--;
            for(int i=index;i<this.index;i++) {
                data[i]=data[i+1];
            }
            if((this.index+1)*4<=data.length) {
                int newlength=data.length/2;
                if(newlength<10) {
                    newlength=10;
                }
                T[] newdata=(T[]) new Object[newlength];
                for(int i=0;i<this.index;i++) {
                    newdata[i]=data[i];
                }
                data=newdata;
            }
        }
        System.out.println(data.length);
        
    }

本次重写ArrayList,只是粗些,我们进行简单入门还是可以的。

手写ArrayList入门