设计一个类 替代数组可以做的事情
数组 长度是固定 存储一组元素
长度一旦固定 使用起来不太方便 添加元素 删除元素
设计一个类---充当一个小容器 ArrayBox
能添加元素 获取元素 删除元素 看一看到底有几个
//你们是使用者(用户) 我是ArrayBox类型的一个具体的对象
//想要存储椅子 你们把椅子直接交给我box
//以前直接找到数组那个人 我就可以帮你们存起来啦
//存储的时候你们自己找位置 至于我把椅子存在了哪里 长度够不够 都不用你们管
//如果数组存满啦自己想办法
数组是一个开发者创建好的类型
数组是一个小容器 存储一组元素
添加元素 获取元素 删除元素
1.创建一个数组对象 1.创建一个ArrayBox对象
int[] array = new int[10]; ArrayBox box = new ArrayBox();
2.添加元素 2.添加元素
array[0] = 10; box.add(10);
3.获取元素
int value = array[0];
通过说明(异常)来告知
4.遍历
for(int i=0;i<array.length;i++){
array[i];
}
ArrayBox.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | public class ArrayBox<E> { //泛型 //描述事物 //属性 // 一间小教室 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]; } //你们是使用者(用户) 我是ArrayBox类型的一个具体的对象 //想要存储椅子 你们把椅子直接交给我box //以前直接找到数组那个人 我就可以帮你们存起来啦 //存储的时候你们自己找位置 至于我把椅子存在了哪里 长度够不够 都不用你们管 //如果数组存满啦自己想办法 //方法 //设计方法 帮忙判断给定index范围是否合法 小D同学 // 需要提供一个index private void rangeCheck( int index){ if (index< 0 || index>=size){ //参考数组的操作 自己定义一个异常(自己创建的类)来说明这个问题 throw new BoxIndexOutOfBoundsException( "Index:" +index+ ",Size:" +size); } } //设计方法 帮我自己做事的 小A同学 // 需要提供一个条件 老师需要的最小容量 // 没有返回值 private void ensureCapacityInternal( int minCapacity){ if (minCapacity - elementData.length > 0 ){ //证明老师需要的最小容量 比原来教室的容量还要大 存不下啦 //扩容---> 小B同学 this .grow(minCapacity); } } //设计方法 帮助教室扩容(新教室) 小B同学--数学很好但倔强的天才 // 需要提供一个条件 老师需要的最小容量 private void grow( int minCapacity){ //获取旧教室的长度 int oldCapacity = elementData.length; //小B同学 做了一个觉得很好的算法 旧教室1.5倍扩容 int newCapacity = oldCapacity + (oldCapacity >> 1 ); //若按照这个很好的算法扩容后 所需要的空间还不够 直接利用minCapacity if (newCapacity - minCapacity < 0 ){ newCapacity = minCapacity; //将老师提供的赋值给newCapacity } //经过一通计算 最终获取到一个合理的长度 newCapacity //按照这个新的长度 创建一个新的教室 旧教室的椅子全部搬入到新教室中 elementData = this .copyOf(elementData,newCapacity); //小C同学做完事情之后 得到一个新教室 } //小C同学--->设计一个方法 负责创建一个新数组 // 将旧数组的元素全部移入新数组内 干体力活的 // 需要新数组的长度 需要提供旧数组 // 需要告知新数组的位置---返回新数组 private Object[] copyOf(Object[] oldArray, int newCapacity){ //创建一个新的数组(新的小教室) Object[] newArray = new Object[newCapacity]; //将旧数组元素全部移入新数组内 for ( int i= 0 ;i<oldArray.length;i++){ newArray[i] = oldArray[i]; } //将新数组返回 return newArray; } //================================================================================== //需要设计一个方法 用来添加元素 // 提供什么条件(参数) 返回一个结果(返回值) // 需要提供一把椅子int 告知用户一个结果 是否存储成功 boolean public boolean add(E element){ //创建box对象时 规定的类型 //确保我自己的属性数组的内部容量 this .ensureCapacityInternal(size + 1 ); //如果上面的这一行代码可以执行完毕 elementData的教室肯定有空间 //我想把element存入elementData里 有效元素个数多记录一个 elementData[size++] = element; //告知用户 存储成功 return true ; //表示成功 } //需要设计一个方法 用来获取元素 // 提供什么条件(参数) 返回结果(返回值) // 提供获取元素的位置 获取位置上的那个元素(int--小椅子) public E get( int index){ //检测index范围是否合法 this .rangeCheck(index); //找到小D同学来帮忙检测 //如果上面一行代码可以走过去 证明index是合法 return (E)elementData[index]; } //需要设计一个方法 用来删除元素 // 提供元素的位置 返回值---删除掉的那个元素 public E remove( int index){ //检测index范围 this .rangeCheck(index); //如果这行代码可以执行过去 没有异常 index合法 //将index位置的旧值保存起来 E oldValue = (E)elementData[index]; //10 20 30 40 50 60 0 0 0 0--->有效元素 //30数字删掉 box.remove(2); //10 20 40 50 60 0 0 0 0 0--->size 5个 for ( int i=index;i<size- 1 ;i++){ //i==2 3 4 elementData[i] = elementData[i+ 1 ]; //从index开始 至size-1为止 将后面位置元素依次前移覆盖 } //10 20 40 50 60 0 0 0 0 0 elementData[--size] = null ; //末尾元素清空 //将旧值返回给用户 return oldValue; } public int size(){ return this .size; } } |
BoxIndexOutOfBoundsException.java
1 2 3 4 5 6 7 8 9 | public class BoxIndexOutOfBoundsException extends RuntimeException{ //想要描述这个类是一个(我们自己的异常 is a 异常)异常 //继承extends 泛化(实现)implements public BoxIndexOutOfBoundsException(){} public BoxIndexOutOfBoundsException(String msg){ super (msg); //msg提供给父类 } } |
Test.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class Test { public static void main(String[] args){ //相当于是用户(你们) //想要存储元素----->第一个是数组[] 第二个是ArrayBox //1.创建一个box对象 ArrayBox<Integer> box = new ArrayBox<Integer>( 6 ); //存储以后长度还能改变 //2.让box干活去 存储一个元素(int-->小椅子) for ( int i= 1 ;i<= 6 ;i++){ box.add(i* 10 ); } //10 20 30 40 50 60 0 0 0 0 System.out.println( "有效元素个数:" +box.size()); //6 //3.获取第全部元素 for ( int i= 0 ;i<box.size();i++){ int value = box.get(i); System.out.print(value+ " " ); //10 20 30 40 50 60 } System.out.println(); //4.删除2号索引位置的元素 int removeValue = box.remove( 2 ); System.out.println(removeValue); //30 System.out.println(box.size()); //5 for ( int i= 0 ;i<box.size();i++){ int value = box.get(i); System.out.print(value+ " " ); //10 20 40 50 60 } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?