根据数组的原理,自己实现一个简易版的ArrayList

前言

很早之前查看了String、ArrayList的源码,发现其内部的核心就是对数组的操作,于是决定根据其原理,自己来尝试实现一个简易版的的ArrayList。
MyArrayList主要包括增、删、改、查几个功能。

代码如下

/**
 * 自己写一个简易版的的ArrayList
 *
 * @author ALion
 * @version 2017/11/3 22:35
 */
public class MyArrayList<E> {

    private Object[] elementData;

    private int size;

    public MyArrayList() {
        this(10);
    }

    public MyArrayList(int initCapacity) {
        if (initCapacity < 0) {
            throw new IllegalArgumentException("initCapacity不应该 < 0");
        }
        elementData = new Object[initCapacity];
    }

    /**
     * 获取容器当前拥有的object的数目
     */
    public int size() {
        return size;
    }

    /**
     * 判断容器内object的数目是否为0
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 在后面添加一个object
     */
    public boolean add(E element) {
        checkCapacity();

        elementData[size++] = element;
        return true;
    }

    /**
     * 获取index位置的object
     */
    public E get(int index) {
        checkIndex(index);

        return (E) elementData[index];
    }

    /**
     * 移除index位置的object
     */
    public boolean remove(int index) {
        checkIndex(index);

        int moveNum = size - (index + 1);
        if (moveNum > 0) {
            System.arraycopy(elementData, index + 1, elementData, index, moveNum);
            elementData[--size] = null;
            return true;
        }
        return false;
    }

    /**
     * 移除一个object
     */
    public boolean remove(Object obj) {
        for (int i = 0; i < elementData.length; i++) {
            if (obj.equals(elementData[i])) {
                return remove(i);
            }
        }
        return false;
    }

    /**
     * 将index位置的值改为传入的object
     */
    public Object set(int index, E element) {
        checkIndex(index);

        E old = (E) elementData[index];
        elementData[index] = element;
        return old;
    }

    /**
     * 在index的位置插入一个object
     */
    public boolean add(int index, E element) {
        checkIndex(index);

        checkCapacity();

        System.arraycopy(elementData, index, elementData, index + 1, size - index);
        elementData[index] = element;
        return true;
    }


    /**
     * 检查index范围
     */
    private void checkIndex(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("index不能 < 0 或者 >= size");
        }
    }

    /**
     * 检查数组容量
     */
    private void checkCapacity() {
        if (size >= elementData.length) {
            Object[] newData = new Object[size * 2 + 1];
            System.arraycopy(elementData, 0, newData, 0, elementData.length);
            elementData = newData;
        }
    }

}

测试一下

/**
 * Main
 *
 * @author ALion
 * @version 2017/11/3 23:04
 */
public class Main {

    public static void main(String[] args) {
        MyArrayList<String> list = new MyArrayList<>();
        list.add("zhangsan");
        list.add("lisi");
        for (int i = 0; i < 10; i++) {
            list.add("wangwu" + i);
        }
        System.out.println(list.size());
        System.out.println(list.get(5));
        list.set(1, "hello");
        list.remove(2);
        list.add(3, "hehe");
        System.out.println(list.isEmpty());

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值