zoukankan      html  css  js  c++  java
  • 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倍大小。

  • 相关阅读:
    信息和熵
    【算法】欧几里得算法与青蛙约会oj
    【算法】并查集模板与练习
    Kaggle-房价预测
    【pytorch】pytorch-backward()的理解
    【pytorch】pytorch-LSTM
    【计算机网络】数据链路层总结
    【Code】numpy、pytorch实现全连接神经网络
    【MT】牛津的MT教程
    【计算机网络】物理层基础知识
  • 原文地址:https://www.cnblogs.com/zbh355376/p/14440610.html
Copyright © 2011-2022 走看看