【java】设计一个类ArrayBox,比数组更灵活(增删元素时不用纠结长度变化的问题)
数组的长度是固定的,存储一组元素(但是固定的长度,使用起来不太方便,不太好频繁的添加元素、删除元素)
设计一个类,充当一个小容器 ArrayBox
- 可以添加元素
- 获取元素
- 删除元素
- 看一看到底有多少个元素
大概功能:
- 添加元素
add()
- 获取元素
get()
- 删除元素
remove()
- 看元素个数
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提供给父类
}
}
上面的代码基本把功能都实现了,但是数组中只能存储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提供给父类
}
}