1.线性表

线性表是一种最基本的数据结构,它是表示一组相同类型数据的有限序列,可以把它当作数组参考,但他不是数组,线性表是一种表结构,它能够支持数据的插入,删除,更新,查找等。同时数组可以随意存放在数组中的任何位置,而线性表只能依次有序排列,不能出现空隙。

2.顺序表

将数据依次存储在连续的整块物理空间中,这种存储结构叫做顺序存储结构。而已这种方式实现的线性表,叫做顺序表。表中的每一个个体都称之为元素,上一个元素称之为 前驱。下一个元素,称之为 后驱。

我们设计线性表的目标就是进行更好的管理数据。对数组进行封装,从而完成增删改查。

java添加删除组件 java先删除再添加_java

以下是java 以数组为底层 通过抽象类对顺序表增删改查的实现

启动类

public class Main {
    public static void main(String[] args) {
        //自己定义的Arraylist
        ArrayList<String> list = new ArrayList<>();
        //添加元素
        list.add("就你了",0);
        list.add("阿狗",1);
        //删除元素
        list.remove(0);
        //查找
        System.out.println(list.get(0));

        System.out.println("就你了,阿狗");
    }
}

定义抽象类方法 

/**
 * 线性表抽象类
 * @param <E> 存储的元素(Element)类型
 */
public abstract class AbstractList<E> {
    /**
     *获取表的长度
     * @return 顺序表的长度
     */
    public abstract int size();

    /**
     *添加一个元素
     * @param e 元素
     * @param index 要添加的位置(索引)
     */
    public abstract void add(E e,int index);

    /**
     *删除指定的元素
     * @param index 元素的位置
     * @return 删除的元素
     */
    public abstract E remove(int index);

    /**
     *查到指定的元素
     * @param index 元素的位置
     * @return 指定位置的元素
     */
    public abstract E get(int index);
}

实现类 

public class ArrayList<E> extends AbstractList<E> {
    //设置底层数组
    private Object[] arr = new Object[10];
    //初始插入的长度
    private int size = 0;

    @Override
    public int size() {
        return size;
    }

    @Override
    public void add(E e, int index) {
        //判断插入位置是否合法 需要按照顺序插入
        if (index > size) throw new IllegalArgumentException("非法的插入位置");
        //判断是否需要扩容 增加的长度等于原本定义长度 则需扩容
        if (size >= arr.length){
            //定义一个新的数组 将原本数组循环遍历放入新数组
            Object[] arr1 = new Object[arr.length + 10];
            for (int i = 0; i < arr.length; i++)
                arr1[i] = arr[i];
            arr = arr1;
        }
        //定义下标访问变量
        int j = size -1;
        while ( j >= index){
            //每一轮循环往后搬一位 后移后面的元素
            arr[j+1] = arr[j];
            j--;
        }
        //插入
        arr[index] = e;
        size++;
    }

    @Override
    public E remove(int index) {
        //判断删除位置是否合法 抛出异常
        if (index > size - 1) throw new IllegalArgumentException("非法的删除位置");
        int i = index;
        E e = (E) arr[i];
        while (i < size - 1){
            //前移 顺序表不能有空隙
            arr[i] = arr[i+1];
            i++;
        }
        size --;
        return e;

    }

    @Override
    public E get(int index) {
        if (index >= size) throw new IndexOutOfBoundsException("无法访问到下标位置");
        return (E) arr[index];
    }
}

 以数组为底层 简单的实现了插入 删除 查询 

需要明白其中每个+1 -1的意义  先要了解顺序表插入的 后移  以及删除的 前移。