自己实现一个简单的ArrayList

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hekai7217/article/details/78834736

自己简单的实现ArrayList的代码,代码注解很清楚了,写了ArrayList的add(obj)方法
remove(index)方法,get(index)方法, 自己定义迭代器,自己进行迭代:

迭代器接口:

public interface Iterator {

    /**
     * 判断是否有下一个
     */
    boolean hasNext();

    /**
     * 下一个返回的元素
     */
    Object next();

    /**
     * 是否是第一个元素
     */
    boolean isFirst(Object obj);

}

集合代码的实现

/**
 * @version
 * @description 自己实现 集合
 */
public class MyListArrayList{

    // ArrayList 的实现原理 是数组
    private Object[] elementData;

    // 集合中有几个元素
    private int size;

    /**
     * 集合中 有几个 元素
     */
    public int size() {
        return size;
    }

    // 构造
    public MyListArrayList() {
        this(10);
    }

    public MyListArrayList(int initialCapacity) {
        this.elementData = new Object[initialCapacity];
    }

    /**
     * 添加元素的方法
     */
    public void add(Object obj) {

        gorw(size + 1);
        elementData[size++] = obj;

    }

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

    /**
     * 通过 下标 来返回 集合中对应 的 下标的 元素
     * 
     */
    public Object get(int index) {
        rangeCheck(index); // 检查 下标是否 越界没有
        return elementData[index];
    }

    /**
     * 通过 下标来移除对应的元素
     */
    public void remove(int index) {

        rangeCheck(index);

        // 删除 之前的
        // a b c d e 移除下标为 2 的元素

        // 5 - 2 - 1 = 2

        // 删除 移动之后的 数组
        // a b d e(移动的个数)

        int numMoved = size - index - 1;

        // index + 1
        /**
         *  src -源数组 
         *  srcPos -源数组中的起始位置。
         *  dest -目标数组。 
         *  destPos在目标数据的起始位置。 l
         *  ength-数组元素的数目被复制。
         */
        System.arraycopy(elementData, index + 1, elementData, index, numMoved);

        // 把最后的 位置 给空 长度 减一
        elementData[--size] = null;
    }

    /**
     * 通过 obj移除
     */
    public void remove(Object obj) {

        for (int i = 0; i < elementData.length; i++) {

            if (obj.equals(elementData[i])) {
                remove(i);
            }
        }
    }

    /**
     * 是否包含
     */
    public boolean contain(Object obj) {

        for (int i = 0; i < elementData.length; i++) {

            if (obj.equals(elementData[i])) {
                return true;
            }
        }
        return false;
    }

    /**
     * 下标 越界 抛出异常
     */
    private void rangeCheck(int index) {
        if (index >= size) {
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
        }
    }

    /**
     * 超过 下标 越界 给出的 信息
     */
    private String outOfBoundsMsg(int index) {
        // TODO Auto-generated method stub
        return "Index: " + index + ", Size: " + size;
    }

    /**
     * 数组的自动扩容
     */
    private void gorw(int minCapacity) {
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

    /**
     * 获取 迭代器 
     */
    public Iterator iterator() {
        return new Itr();
    }

    /**
     * 自己定义的迭代器
     * @version 
     * @description
     */
    private class Itr implements Iterator{

        int cursor; // index of next element to return

        @Override
        public boolean hasNext() {
            return cursor != size;
        }

        @Override
        public Object next() {
            int i = cursor;
            Object[] elementData = MyListArrayList.this.elementData;
            cursor = i + 1;
            return elementData[i];
        }

        @Override
        public boolean isFirst(Object obj) {
            Object[] elementData = MyListArrayList.this.elementData;
            return elementData[0].equals(obj);
        }
    }
}

测试类代码实现:

/**
 * @version 
 * @description 测试自己定义的 集合类
 */
public class MyListTest {

    public static void main(String[] args) {
        MyListArrayList myListArrayList = new MyListArrayList(4);

        //添加方法
        myListArrayList.add("aa");
        myListArrayList.add("11");
        myListArrayList.add("cc");
        myListArrayList.add("22");
        myListArrayList.add("小马哥");

        //移除方法
        myListArrayList.remove("aa");
        myListArrayList.remove("11");

        //是否包含
        System.out.println(myListArrayList.contain("222"));
        System.out.println(myListArrayList.size());

        //获取元素方法
        System.out.println(myListArrayList.get(2));

        System.out.println("*******遍历************");

        for (int i = 0; i < myListArrayList.size(); i++) {

            System.out.println(myListArrayList.get(i));
        }

        System.out.println("*******iterator*******");
        Iterator iterator = myListArrayList.iterator();

        //是否为第一个
        boolean flag = iterator.isFirst("cc");

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

    }
}

猜你喜欢

转载自blog.csdn.net/hekai7217/article/details/78834736