ArrayBox

//模拟ArrayList的存入删除
public class ArrayBox<T> {
    //使数组的长度不可变
    private static final int DEFAULT_CAPACITY = 10;
    private Object []elementData;//长度一旦确定不能再次发生改变
    //记录数组的有效长度
    private int size = 0;

    public ArrayBox(){
        elementData = new Object[DEFAULT_CAPACITY];
    }
    public ArrayBox(int capacity){
        elementData = new Object[capacity];
    }
    //查看数组是否能装下新存放的数据,如果不能 就进行扩容
    private void ensureCapacityInternal(int minCapacity){
       //如果数据长度大于创建的数组的长度,就进行扩容
        if(minCapacity>elementData.length){
           //扩容方法
            this.grow(minCapacity);
       }
    }
    //扩容方法
    private void grow(int minCapacity){
        int oldArrayLength = elementData.length;
        int newArrayLength = oldArrayLength + (oldArrayLength>>1);//扩容1.5倍
        if(newArrayLength < minCapacity){
            newArrayLength = minCapacity;
        }
        elementData = this.copyOf(elementData,newArrayLength);
    }
    //将旧数组的数据传入新数组,由于数组长度不可变,所以需要创建一个新数组
    private Object[] copyOf(Object [] oldArray,int newArrayLength){
        Object [] newArray = new Object[newArrayLength];
        for (int i=0; i<oldArray.length; i++){
            newArray[i] = oldArray[i];
        }
        return newArray;
    }
    //判断索引是否越界
     private void rangeCheck(int index){
        if(index<0 || index>=size){     //index有效 <= size - 1
            //参考数组的操作  自己定义一个异常(自己创建的类)来说明这个问题
            throw new MyException("Index:"+index+",Size:"+size);
        }
    }
    //---------------------------------
    //添加元素
    public boolean add(int element){
        //确保我自己的属性数组的内部容量
        this.ensureCapacityInternal(size+1);
        //size 是有效元素的个数,所以应该从1开始存储
        elementData[size++] = element;
        return true;
    }
    //获取索引位置的元素
    public T get(int index){
        //检测index范围
        this.rangeCheck(index);
        return (T)elementData[index];
    }
    //删除元素,并可以获得删除的元素
    public T remove(int index){
        //检测index范围
        this.rangeCheck(index);
        T oldValue = (T)elementData[index];
        for(int i=index;i<size-1;i++){
            elementData[i] = elementData[i+1];
        }
        elementData[--size] = null;//末尾元素清空
        return oldValue;
    }
    //获取数组长度
    public int size(){
        return this.size;
    }
}
//自己的异常类
public class MyException extends RuntimeException {
    public MyException(){}
    public MyException(String msg){
        super(msg);
    }
}

摘自:[https://www.cnblogs.com/yyanghang/p/11061662.html]

猜你喜欢

转载自www.cnblogs.com/passer-byZe/p/12521077.html
今日推荐