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

  • 相关阅读:
    qt动态加载UI文件
    Qt常见控件和操作
    MySQL
    tomcat
    linux iptables基础
    linux 网络基础
    linux CA及OpenSSL学习
    k8s 访问控制
    k8s 存储卷
    docker 安装部署
  • 原文地址:https://www.cnblogs.com/zbh355376/p/14440610.html
Copyright © 2011-2022 走看看