java 动态数组对象_Java实现动态数组

普通数组的元素个数是固定的,当数组满了之后要怎么办?数组要有多大才合适,有时提前并不知道。所以希望能够在运行时具有改变数组大小的能力。

动态数组就可以在任何时候改变大小。动态数组是指在声明时没有确定数组的大小,使用动态数组的优点是可以根据用户需求,有效利用存储空间。

假如有一个班级对象clazz,这有一个方法addStudent,这个方法的参数是Student对象,当我们调用addStudent方法添加学生时,在clazz对象中有一个students数组来存放学生对象,但是当数组满了后,就要创建一个新的数组,这个数组要比原数组大,并把原数组中的学生对象转移到新数组中,并把原数组释放了,这样就成了动态数组,只要调用addStudent者愿意,它就可以一直给clazz添加学生。开发中当数组满时,创建的新数组大小不会是比原数组多一个元素,这样会在后续加入学生时,每次都创建新数组,转移数组元素,释放原数组,效率太低,往往创建的新数组大小是原数组的1.5倍大小。

实现

import java.util.Arrays;

/**

* copyright(c)2021 zbh.ALL rights Reserved

*

* 描述:

*

* @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));

}

}

运行结果:

eb72e135aee86db6ae67303770c92c24.png

由结果可得:数组初始只有四个大小,当不断向里面添加数字,数组的容积也在不断扩大,结果中最后的三个0(没有放数据,系统给的默认值)是因为创建的新数组大小不会是比原数组多一个元素,这样会在后续加入学生时,每次都创建新数组,转移数组元素,释放原数组,效率太低,往往创建的新数组大小是原数组的1.5倍大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值