import java.util.NoSuchElementException;

public class MyArrayList<E> {
    // 存储数据得数组
    private E[] data;
    // 记录数组中元素得个数
    private int size;
    // 设置初始容量
    private static final int CAPACITY = 10;

    public MyArrayList() {
        this.data = (E[]) new Object[CAPACITY];
        this.size = 0;
    }

    public MyArrayList(int initCapacity) {
        this.data = (E[]) new Object[initCapacity];
        this.size = 0;
    }

    /* 增 */
    public void addLast(E e) {
        if (data.length == size) { // 大小不够就扩容
            resize(data.length * 2);
        }
        data[size] = e;
        size++;
    }

    // 在index索引位置添加一个元素element
    public void add(int index, E element) { // 大小不够就扩容
        checkPositionIndex(index); // 检查index索引位置是否可以添加元素
        if (data.length == size) {
            resize(data.length * 2);
        }
        for (int i = size; i < index; i--) { // 先移动位置
            data[i] = data[i - 1];
        }
        data[index] = element;
        size++;

    }

    /* 删除 */
    // 移除数组中最后一个元素并返回
    public E removeLast() {
        if (isEmpty()) {
            throw new NoSuchElementException();
        }
        if (size < data.length / 4) { // 如果数组元素个数小于了数组的四分之一,那么就缩容,防止占用太多内存
            resize(data.length / 2);
        }
        E temp = data[size - 1]; // 存储要被删除的元素,以供后面返回
        data[size - 1] = null; // 必须置空,才能让GC回收
        size--;
        return temp;
    }

    // 删除index对应的元素并返回
    public E remove(int index) {
        checkElementIndex(index);
        E temp = data[index];
        for (int i = index; i < size; i++) {
            data[i] = data[i + 1];
        }
        size--;
        return temp;
    }

    /* 改 */
    // 把索引为index的元素改为element并返回原来的元素
    public E set(int index, E element) {
        checkElementIndex(index);
        E temp = data[index]; // 存储没改的时候的元素,以供后面返回
        data[index] = element;
        return temp;
    }

    /* 查 */
    // 返回索引位置index的元素
    public E get(int index) {
        checkElementIndex(index);
        return data[index];
    }

    /* 主要函数 */
    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    /* 私有函数 */
    private boolean isElementIndex(int index) {
        return index >= 0 && index < size;
    }

    private boolean isPositionIndex(int index) {
        return index >= 0 && index <= size;
    }

    // 检查index索引位置是否可以存在元素
    private void checkElementIndex(int index) {
        if (!isElementIndex(index)) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
    }

    // 检查index索引位置是否可以添加元素
    private void checkPositionIndex(int index) {
        if (!isPositionIndex(index)) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
    }

    // 把数组大小扩容或者缩容为newCap
    private void resize(int newCap) {
        E[] temp = (E[]) new Object[newCap];
        // copy数据
        System.arraycopy(data, 0, temp, 0, size);
        data = temp;
    }

    /* toString方法 */
    public String toString() {
        StringBuilder builder = new StringBuilder();
        for(int i = 0;i < size;i++) {
            builder.append(data[i] + " ");
        }
        return builder.toString();
    }

}

测试Main类

public class Main {
    public static void main(String[] args) {
        MyArrayList<Integer> list = new MyArrayList<Integer>(100);
        list.add(0, 1);
        list.add(1, 2);
        list.add(2, 3);
        System.out.println(list.get(0));
        System.out.println(list.get(1));
        System.out.println(list.get(2));
        System.out.println(list);
    }
}