【java】设计一个类ArrayBox,比数组更灵活(增删元素时不用纠结长度变化的问题)

数组的长度是固定的,存储一组元素(但是固定的长度,使用起来不太方便,不太好频繁的添加元素、删除元素)

设计一个类,充当一个小容器 ArrayBox

  • 可以添加元素
  • 获取元素
  • 删除元素
  • 看一看到底有多少个元素

大概功能:

  1. 添加元素add()
  2. 获取元素get()
  3. 删除元素remove()
  4. 看元素个数size()

下面我写了三个类(同包中)

Demo.java

public class Demo {
    public static void main(String[] args){
        // 创建一个ArrayBox对象
        ArrayBox box = new ArrayBox();

        //1.添加元素
        for(int i = 1;i <= 6; i++){
            box.add(i*100);
        }
        //4.看元素的个数
        System.out.println("有效元素个数:" +  box.size());
        System.out.println("真实数组长度:" + box.elementDataLength());


        //2.获取元素
        for(int i = 0; i < box.size();i++){
            int value = box.get(i);
            System.out.print(value + " ");
        }
        System.out.println();


        //3.删除元素
        int removeValue = box.remove(3);
        System.out.println("删除元素:"+ removeValue);
        System.out.println("有效元素个数:" +  box.size());
        for(int i = 0; i < box.size();i++){
            int value = box.get(i);
            System.out.print(value + " ");
        }
        System.out.println();

    }
}

ArrayBox.java

public class ArrayBox {
    //描述事物
    //属性:
    private static final int DEFAULT_CAPACITY = 10;
    private int[] elementData;//给ArrayBox一个初始数组
    private int size = 0;//记录ArrayBox中有效数据的个数,给一个初始值

    //构造方法:
    public ArrayBox(){
        elementData = new int[DEFAULT_CAPACITY];
    }
    public ArrayBox(int capacity){
        elementData = new int[capacity];
    }


    //方法:
    //1.需要设计一个方法,用来添加元素
    //      提供什么条件(参数)  返回一个结果(返回值)--告知用户一个结果,是否存储成功 boolean
    //
    //存储元素的时候方法给位置存放
    //如果位置满了,方法要解决这个问题

    public boolean add(int element){                   //添加元素
        //首先要确保自己的属性数组的内部容量够不够用
        //      调用一个方法,来确定内部容量够用否
        this.ensureCapacity(size+1);

        //我想把element存入elementData数组中
        elementData[size++] = element;
        return true;
    }
    //访问控制修饰符是private的,是不希望用户看到的方法
    private void ensureCapacity(int minCapacity){    //来确定内部容量够用否
                                //minCapacity即用户所需最小空间
        if(minCapacity > elementData.length){
            //如果内部容量不够用,调用一个扩容的方法
            this.grow(minCapacity);
        }
    }

    private void grow(int minCapacity){  //给内部空间扩容
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity>>1);//即oldCapacty*1.5
        if(newCapacity < minCapacity){
            newCapacity = minCapacity;
        }

        //既然要把空间扩容,要把旧数组的内容放到新的更大空间的数组中
                //调用一个类,复制数组内容
        elementData = this.copyOf(elementData,newCapacity);
    }

    private int[] copyOf(int[] oldArray,int newCapacity){  //把就数组的内容复制到新的数组中
        int[] newArray = new int[newCapacity];
        for(int i = 0; i < elementData.length; i++){
            newArray[i] = oldArray[i];
        }
        return newArray;
     }


     //2.需要设计一个方法 用来获取元素
    public int get(int index){
        //调用一个方法,先检验index是否合法
        this.rangeCheck(index);
        return elementData[index];
    }

    private void rangeCheck(int index){       //检验index是否合法
        if(index < 0 || index > this.size){
            //参考数组的操作,自己定义一个异常(自己创建的类)来说明这个问题
            throw new BoxIndexOutOfBoundsException("index:" + index + ",Size" + size);
        }
    }


    //3.需要设计一个方法,删除元素
    public int remove(int index){
        //检测index是否合法
        this.rangeCheck(index);

        //将要删除的元素保存下来,返回给用户
        int oldValue = elementData[index];

        //删除元素
        for(int i = index;i < size-1; i++){
            elementData[i] = elementData[i+1];
        }
        elementData[--size] = 0;

        return oldValue;
    }

    //4.设计一个方法,看元素的个数

    public int elementDataLength(){   //给用户查看真实数组的长度
        return elementData.length;
    }

    public int size(){           //给用户查看有效元素的个数
        return this.size;
    }




     //程序块:

}

BoxIndexOutOfBoundsException.java

public class BoxIndexOutOfBoundsException extends RuntimeException{

    public BoxIndexOutOfBoundsException(){}
    public BoxIndexOutOfBoundsException(String msg){
        super(msg);//msg提供给父类
    }
}

【java】设计一个类ArrayBox,比数组更灵活(增删元素时不用纠结长度变化的问题)

上面的代码基本把功能都实现了,但是数组中只能存储int类型,我希望也可以存别的

优化代码如下:

public class Demo {
    public static void main(String[] args){
        // 创建一个ArrayBox对象
        ArrayBox<Integer> box = new ArrayBox<Integer>();

        //1.添加元素
        for(int i = 1;i <= 6; i++){   //如果将数组的数据类型改掉,那么这几行代码要相应的改动一下
            box.add(i*100);
        }
        //4.看元素的个数
        System.out.println("有效元素个数:" +  box.size());
        System.out.println("真实数组长度:" + box.elementDataLength());


        //2.获取元素
        for(int i = 0; i < box.size();i++){
            int value = box.get(i);
            System.out.print(value + " ");
        }
        System.out.println();


        //3.删除元素
        int removeValue = box.remove(3);
        System.out.println("删除元素:"+ removeValue);
        System.out.println("有效元素个数:" +  box.size());
        for(int i = 0; i < box.size();i++){
            int value = box.get(i);
            System.out.print(value + " ");
        }
        System.out.println();

    }
}

public class ArrayBox<E> { //泛型
    //描述事物
    //属性:
    private static final int DEFAULT_CAPACITY = 10;
    private Object[] elementData;//给ArrayBox一个初始数组
    private int size = 0;//记录ArrayBox中有效数据的个数,给一个初始值

    //构造方法:
    public ArrayBox(){
        elementData = new Object[DEFAULT_CAPACITY];
    }
    public ArrayBox(int capacity){
        elementData = new Object[capacity];
    }


    //方法:
    //1.需要设计一个方法,用来添加元素
    //      提供什么条件(参数)  返回一个结果(返回值)--告知用户一个结果,是否存储成功 boolean
    //
    //存储元素的时候方法给位置存放
    //如果位置满了,方法要解决这个问题

    //添加元素
    public boolean add(E element){//E是创建box对象时,规定的类型

        //首先要确保自己的属性数组的内部容量够不够用
        //      调用一个方法,来确定内部容量够用否
        this.ensureCapacity(size+1);

        //我想把element存入elementData数组中
        elementData[size++] = element;
        return true;
    }
    //访问控制修饰符是private的,是不希望用户看到的方法
    private void ensureCapacity(int minCapacity){    //来确定内部容量够用否
                                //minCapacity即用户所需最小空间
        if(minCapacity > elementData.length){
            //如果内部容量不够用,调用一个扩容的方法
            this.grow(minCapacity);
        }
    }

    private void grow(int minCapacity){  //给内部空间扩容
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity>>1);//即oldCapacty*1.5
        if(newCapacity < minCapacity){
            newCapacity = minCapacity;
        }

        //既然要把空间扩容,要把旧数组的内容放到新的更大空间的数组中
                //调用一个类,复制数组内容
        elementData = this.copyOf(elementData,newCapacity);
    }

    private Object[] copyOf(Object[] oldArray,int newCapacity){  //把就数组的内容复制到新的数组中
        Object[] newArray = new Object[newCapacity];
        for(int i = 0; i < elementData.length; i++){
            newArray[i] = oldArray[i];
        }
        return newArray;
     }


     //2.需要设计一个方法 用来获取元素
    public E get(int index){
        //调用一个方法,先检验index是否合法
        this.rangeCheck(index);
        return (E)elementData[index];
    }

    private void rangeCheck(int index){       //检验index是否合法
        if(index < 0 || index > this.size){
            //参考数组的操作,自己定义一个异常(自己创建的类)来说明这个问题
            throw new BoxIndexOutOfBoundsException("index:" + index + ",Size" + size);
        }
    }


    //3.需要设计一个方法,删除元素
    public E remove(int index){
        //检测index是否合法
        this.rangeCheck(index);

        //将要删除的元素保存下来,返回给用户
        E oldValue = (E)elementData[index];

        //删除元素
        for(int i = index;i < size-1; i++){
            elementData[i] = elementData[i+1];
        }
        elementData[--size] = null;//末尾元素清空

        return oldValue;
    }

    //4.设计一个方法,看元素的个数

    public int elementDataLength(){   //给用户查看真实数组的长度
        return elementData.length;
    }

    public int size(){           //给用户查看有效元素的个数
        return this.size;
    }




     //程序块:

}

public class BoxIndexOutOfBoundsException extends RuntimeException{

    public BoxIndexOutOfBoundsException(){}
    public BoxIndexOutOfBoundsException(String msg){
        super(msg);//msg提供给父类
    }
}