数据结构1:ArrayList简单实现

代码不全只是自己记录学习,借鉴:https://blog.csdn.net/javazejian/article/details/52953190;强烈推荐此大神博客。。。


1.泛型的创建

创建接口

public interface FanXing_Test<T> {

    int get();
}

创建class

public class FanXing_calss<T> implements FanXing_Test<T> {

   
    @Override
    public int get() {
        return 0;
    }
}

调用方法

public class test{

    public static void main(String[] args) {
      
        FanXing_calss<Integer> test=new FanXing_calss<>();

    }
}

T会自动转换数据类型,实现统用型


2.构造方法,创建对象时初始化对象

  private Object[] table;                      //数组声明,用于存储元素,开辟内存空间
    private int length;                          //顺序表的大小,就是数组内储存数据的个数  所以length-1就是最大的索引位置

    public SeqList(int capacity)
    {
        //申请数组存储空间,元素初始化为null 构造方法,开辟内存空间
        this.table = new Object[Math.abs(capacity)];
        this.length = 0;
    }

    /**
     * 默认大小为64
     */
    public SeqList()
    {
        this(64);
    }


3.arraylist删除和添加的方法

 /**
     * 根据index插入元素
     * @param index 插入位置的下标,0作为起始值
     * @param data 插入的数据
     * @return
     */
    @Override
    public boolean add(int index, T data)
    {
        if (data==null)
            return false;

        //插入下标的容错判断,插入在最前面
        if (index<0)
            index=0;

        //插入下标的容错判断,插入在最后面   this.length是最大所以呢 加1
        if (index>this.length)
            index = this.length;

        //判断内部数组是否已满
        if (this.length==table.length)//这里是table.length初始化的64
        {
            //把原数组赋值给临时数组
            Object[] temp = this.table;

            //对原来的数组进行成倍拓容,并把原数组的元素复制到新数组
            this.table = new Object[temp.length*2];

            //先把原数组下标从0到index-1(即插入位置的前一个位置)复制到新数组
            for (int i=0; i<index; i++) {
                this.table[i] = temp[i];
            }
        }

        //从原数组的最后一个元素开始直到index位置,都往后一个位置
        // 最终腾出来的位置就是新插入元素的位置了
        for (int j=this.length-1; j>=index; j--) {//只有在j>=index时才执行  length是该数组的内有几个具体数据的长度
                                                    //index是插入元素的在申请内存空间的位置
            this.table[j + 1] = this.table[j];
        }
        //如果j(最大索引)<插入索引直接插入数据
        //插入新值
        this.table[index] = data;
        //长度加一
        this.length++;
        //插入成功
        return true;
    }

    /**
     * 在尾部插入元素
     * @param data
     * @return
     */
    @Override
    public boolean add(T data)
    {
        return add(this.length, data);
    }

    /**
     * 根据index删除元素
     * @param index 需要删除元素的下标
     * @return
     */
    @Override
    public T remove(int index)
    {
        if (this.length!=0 && index>=0 && index<this.length)
        {
            //记录删除元素的值并返回
            T old = (T)this.table[index];

            //从被删除的元素位置开,其后的元素都依次往前移动
            for (int j=index; j<this.length-1; j++) {
                this.table[j] = this.table[j + 1];
            }
            //设置数组元素对象为空
            this.table[this.length-1]=null;
            //顺序表长度减1
            this.length--;
            return old;
        }
        return null;
    }

    /**
     * 根据data删除某个数据
     * @param data
     * @return
     */
    @Override
    public boolean remove(T data) {
        if (this.length!=0 && data!=null)
            return this.remove(this.indexOf(data))!=null;
        return false;
    }



猜你喜欢

转载自blog.csdn.net/qq_38788128/article/details/80859610