Java实现动态数组
普通数组的元素个数是固定的,当数组满了之后要怎么办?数组要有多大才合适,有时提前并不知道。所以希望能够在运行时具有改变数组大小的能力。
动态数组就可以在任何时候改变大小。动态数组是指在声明时没有确定数组的大小,使用动态数组的优点是可以根据用户需求,有效利用存储空间。
假如有一个班级对象clazz,这有一个方法addStudent,这个方法的参数是Student对象,当我们调用addStudent方法添加学生时,在clazz对象中有一个students数组来存放学生对象,但是当数组满了后,就要创建一个新的数组,这个数组要比原数组大,并把原数组中的学生对象转移到新数组中,并把原数组释放了,这样就成了动态数组,只要调用addStudent者愿意,它就可以一直给clazz添加学生。开发中当数组满时,创建的新数组大小不会是比原数组多一个元素,这样会在后续加入学生时,每次都创建新数组,转移数组元素,释放原数组,效率太低,往往创建的新数组大小是原数组的1.5倍大小。
实现
import java.util.Arrays;
/**
* copyright(c)2021 zbh.ALL rights Reserved
* <p>
* 描述:
*
* @author zbh
* @version 1.0
* @date 2021/2/23
*/
public class Demo6 {
/**
* 初始数组大小
*/
private static final int INIT = 4;
/**
* 存储数据数组
*/
int[] arr;
/**
* 当前位置
*/
int index = 0;
/**
* 无参默认的构造方法
*/
public Demo6() {
// 构造方法嵌套调用,直接写this,不写方法名
// 此代码只能是第一行
this(INIT);
}
/**
* 初始化对象
*
* @param capacity 数组初始值
*/
public Demo6(int capacity) {
this.arr = new int[capacity];
}
/**
* 增加一个数字
*
* @param num
*/
public void add(int num) {
if (index >= arr.length) {
// arr.length >> 1 等同于arr.length除以2
int length = arr.length + (arr.length >> 1);
// 转移数组元素,第一个参数是原数组,第二个参数是新数组的长度,copyOf返回新数组
arr = Arrays.copyOf(arr,length);
}
arr[index++] = num;
}
public static void main(String[] args) {
Demo6 d = new Demo6();
for (int i=0;i<20;i++) {
d.add(i);
}
System.out.println(Arrays.toString(d.arr));
}
}
运行结果:
由结果可得:数组初始只有四个大小,当不断向里面添加数字,数组的容积也在不断扩大,结果中最后的三个0(没有放数据,系统给的默认值)是因为创建的新数组大小不会是比原数组多一个元素,这样会在后续加入学生时,每次都创建新数组,转移数组元素,释放原数组,效率太低,往往创建的新数组大小是原数组的1.5倍大小。