自己实现ArrayList

自己实现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只是值判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值