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倍大小。

原文地址:https://www.cnblogs.com/zbh355376/p/14440610.html