JAVA--自己实现ArrayList

来源:互联网 发布:gson遍历json 编辑:程序博客网 时间:2024/06/05 00:30

本次实现的ArrayList并未使用泛型,以后添加。
在自己实现ArrayList之前强烈建议先看一遍JDK的源码,有助于理解。
附上一个链接深入Java集合学习系列:ArrayList的实现原理
我自己实现了ArrayList中的add,get,set,remove方法
MyArrayList:

import java.util.Arrays;/* * ArrayList的底层实现为数组 * MyArrayList暂时不考虑泛型 */public class MyArrayList {    private Object[] elementData;//存放Object的数组    private int size;//ArrayList大小    public MyArrayList() {        this(10);//如果不指定大小,默认大小为10    }    public MyArrayList(int initSize) {        if(initSize<0){            throw new IllegalArgumentException("IllegalArgument:"+initSize);//参数不合法,抛出异常        }        elementData = new Object[initSize];    }    public void add(Object obj) {//在末尾条件元素        checkCapacity(size+1);//插入一个元素,至少需要size+1大小的空间        elementData[this.size++] = obj;    }    public void add(int index,Object obj) {//在index处插入元素obj        RangeCheck(index);        checkCapacity(size+1);//插入一个元素,至少需要size+1大小的空间        System.arraycopy(elementData, index, elementData, index+1, size-index);//将index后的元素都后移一个位置        elementData[index] = obj;        size++;    }    private void checkCapacity(int needCapacity) {//检查ArrayList开辟的空间是否足够,如果不足则进行扩容        if(needCapacity>elementData.length){//空间不足,扩容            Object oldelementData[] = elementData;            int newSize = this.size*2+1;//扩容的空间            elementData = new Object[newSize];            elementData = Arrays.copyOf(oldelementData, newSize);        }    }     private void RangeCheck(int index) {//检查索引是否合法        if(index<0||index>=size){            throw new IndexOutOfBoundsException("IllegalArgument"+index);//出界,抛出异常        }    }    public Object get(int index) {//根据索引返回对象        RangeCheck(index);        return elementData[index];    }    public Object set(int index,Object obj) {//将index位置置为obj        RangeCheck(index);        Object oldvalue = elementData[index];        elementData[index] = obj;//设置新值        return oldvalue;//返回旧值    }    public Object remove(int index) {//删除index处的元素        RangeCheck(index);        Object oldValue = elementData[index];        int moveNum = size-index-1;        if(moveNum>0){            System.arraycopy(elementData, index+1, elementData, index, moveNum);        }           elementData[--size] = null;//让垃圾回收器回收        return oldValue;//返回旧值    }    public boolean remove(Object obj) {//删除等于obj的元素,成功返回true,失败返回false        if(obj == null){            for(int i=0;i<size;i++){                if(elementData[i]==null){                    fastremove(i);                    return true;                }            }        }else {            for(int i=0;i<size;i++){                if(obj.equals(elementData[i])){//obj不为null,一定要在前,否则使用elementData[i]调用equals()可能导致控制在异常                    fastremove(i);                    return true;                }            }        }        return false;    }    public void fastremove(int index) {        int moveNum = size-index-1;        if(moveNum>0){            System.arraycopy(elementData, index+1, elementData, index, moveNum);        }           elementData[--size] = null;//让垃圾回收器回收    }    public int size(){        return this.size;    }    public int length() {        return elementData.length;    }}

测试:

public class TestMyArrayList {    public static void main(String[] args) {        MyArrayList List = new MyArrayList(5);        //末尾插入        List.add(new A("张三"));        List.add(new A("李四"));        List.add(new A("王五"));        List.add(new A("JACK"));        List.add(new A("张三"));        List.add(new A("李四"));        List.add(new A("王五"));        List.add(new A("JACK"));        //自选位置插入        List.add(2,new A("TOM"));        System.out.println(List.size());        System.out.println(((A)List.get(8)).name);        //将index处置为新值        A oldA = (A)List.set(3, new A("Lucy"));        System.out.println(oldA.name);//打印旧值        System.out.println(((A)List.get(3)).name);//打印新值        System.out.println(List.size());        //将index处的元素删除        oldA = (A)List.remove(3);        System.out.println(oldA.name);//打印删除的元素        System.out.println(List.size());        //删除和指定对象匹配的元素        A temp = new A("Lily");        List.add(temp);        System.out.println(List.remove(temp));    }}class A{    String name;    public A(String name) {        super();        this.name = name;    }}
原创粉丝点击