Java - 面向对象类的练习(二) June 20,2019
2.设计一个类 模拟数组的添加和删除
//模拟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); } }