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

来源:互联网 发布:c和c 程序员面试秘笈 编辑:程序博客网 时间:2024/05/17 06:38

前言

很早之前查看了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());    }}