自己实现一个简单的ArrayList

来源:互联网 发布:mac检测硬件信息 编辑:程序博客网 时间:2024/06/05 01:57

自己简单的实现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());        }    }}