自己实现ArrayList

来源:互联网 发布:有关大数据的论文题目 编辑:程序博客网 时间:2024/05/16 02:44

自己实现ArrayList

Java中有一个ArrayList和C++中Vector非常的相似。

/* * 自己实现ArrayList */public class SxtArrayList {    private Object[] elementData;    private int size;    public int size(){        return  size;    }    public boolean isEmpty(){        return size == 0;    }    public SxtArrayList(){        this(10); // 默认数组的长度是10    }    public SxtArrayList(int initialCapacity){        if(initialCapacity < 0){//鲁棒性            try {                throw new Exception();            } catch (Exception e) {                e.printStackTrace();            }        }        elementData = new Object[initialCapacity]; //创建大小为in...的数组    }    public void add(Object obj){        //数组扩容        ensureCapacity();        elementData[size] = obj;        size++;    }    public void add(int index, Object obj){        rangeCheck(index);        //数组扩容        ensureCapacity();        System.arraycopy(elementData, index,                 elementData, index+1, size - index);//copy        elementData[index] = obj;        size++;    }    /*     * 数组扩充函数     */    public void ensureCapacity(){        //数组扩容        if(size >= elementData.length){            Object [] newArray = new Object[size*2 + 1];            System.arraycopy(elementData,                     0, newArray, 0, elementData.length);//copy            elementData = newArray;        }    }    public Object get(int index){        rangeCheck(index);        return elementData[index];    }    public Object set(int index, Object obj){        rangeCheck(index);        Object oldValue = elementData[index];        elementData[index] = obj;        return oldValue;    }    public void remove(int index){        rangeCheck(index);        int oldMoved = size - index - 1;        if(oldMoved > 0){            System.arraycopy(elementData, index+1, elementData, index, oldMoved);        }        elementData[--size] = null;//不在后边是防止越界    }    public void remove(Object obj){        for(int i = 0; i< size; i++){            if(get(i).equals(obj)){                remove(i);            }        }    }    private void rangeCheck(int index){        if(index <0 || index >= size){            try {                throw new Exception();            } catch (Exception e) {                e.printStackTrace();            }        }    }    public static void main(String[] args){        SxtArrayList list = new SxtArrayList(3);        list.add("111");        list.add("222");        list.add("33");        list.add("1");        list.add("555");        list.remove("555");        list.set(0, "不是111");        list.add(0, "是000");        System.out.println(list.get(0));//get获取的是数组中的值所以是"是000"        System.out.println(list.size());    }}

SxtArrayList相当于一个动态数组,可以在一定条件下自动变大。
其中有一个基础的数组容器是Object类型的elementData[]。
int变量size用来记录SxtArrayList中有效值的个数。

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

判断SxtArrayList对象是否为空。


    public SxtArrayList(){        this(10); // 默认数组的长度是10    }    public SxtArrayList(int initialCapacity){        if(initialCapacity < 0){//鲁棒性            try {                throw new Exception();            } catch (Exception e) {                e.printStackTrace();            }        }        elementData = new Object[initialCapacity]; //创建大小为in...的数组    }

带参数的构造函数和不带参数的构造函数。不带参数的构造函数会使用默认值通过this方式调用带参构造函数。SxtArrayList() -> SxtArrayList(int initialCapacity)。


    public void add(Object obj){        //数组扩容        ensureCapacity();        elementData[size] = obj;        size++;    }    public void add(int index, Object obj){        rangeCheck(index);        //数组扩容        ensureCapacity();        System.arraycopy(elementData, index,                 elementData, index+1, size - index);//copy        elementData[index] = obj;        size++;    }    /*     * 数组扩充函数     */    public void ensureCapacity(){        //数组扩容        if(size >= elementData.length){            Object [] newArray = new Object[size*2 + 1];            System.arraycopy(elementData,                     0, newArray, 0, elementData.length);//copy            elementData = newArray;        }    }

add是SxtArrayList的增加数据的方法。
由于参数中都为Object类型,所以SxtArrayList存放地可以是任意类型。
在添加数据之前进行判断是否现有的elementData[]数组是否可以放下新添加的数据(已经装满没)。若不能添加,则调用ensureCapacity()函数“扩大”数组elementData[]的大小。


    private void rangeCheck(int index){        if(index <0 || index >= size){            try {                throw new Exception();            } catch (Exception e) {                e.printStackTrace();            }        }    }

对于数组的操作是不能离开下标的,而下标常常会产生运行时错误,rangeCheck()是用来判断下标是否越界的。


    public Object get(int index){        rangeCheck(index);        return elementData[index];    }    public Object set(int index, Object obj){        rangeCheck(index);        Object oldValue = elementData[index];        elementData[index] = obj;        return oldValue;    }

修改elementData[]数组位置index中存放的值,获取elementData[]数组位置index中存放的值。


    public void remove(int index){        rangeCheck(index);        int oldMoved = size - index - 1;        if(oldMoved > 0){            System.arraycopy(elementData, index+1, elementData, index, oldMoved);        }        elementData[--size] = null;//不在后边是防止越界    }    public void remove(Object obj){        for(int i = 0; i< size; i++){            if(get(i).equals(obj)){                remove(i);            }        }    }

移除特定的对象,可以通过下标和Object对象方式进行查找,equals只是值判断。

原创粉丝点击