zoukankan      html  css  js  c++  java
  • 在向一个ArrayList中添加大量元素前,可以使用ensureCapacity方法来增加ArrayList的容量

    参考http://www.jianshu.com/p/f174d49b391c

    ensureCapacity(),该方法就是 ArrayList 的扩容方法。在前面就提过 ArrayList 每次新增元素时都会需要进行容量检测判断,若新增元素后元素的个数会超过 ArrayList 的容量,就会进行扩容操作来满足新增元素的需求。所以当我们清楚知道业务数据量或者需要插入大量元素前,我可以使用 ensureCapacity 来手动增加 ArrayList 实例的容量,以减少递增式再分配的数量。

    public void ensureCapacity(int minCapacity) {
                //修改计时器
                modCount++;
                //ArrayList容量大小
                int oldCapacity = elementData.length;
                /*
                 * 若当前需要的长度大于当前数组的长度时,进行扩容操 作
                 */
                if (minCapacity > oldCapacity) {
                    Object oldData[] = elementData;
                    //计算新的容量大小,为当前容量的1.5倍
                    int newCapacity = (oldCapacity * 3) / 2 + 1;
                    if (newCapacity < minCapacity)
                    newCapacity = minCapacity;
                    //数组拷贝,生成新的数组
                    elementData = Arrays.copyOf(elementData, newCapacity);
                }
            }
    

      

    在这里有一个疑问,为什么每次扩容处理会是 1.5 倍,而不是 2.5、3、4 倍呢?通过 google 查找,发现 1.5 倍的扩容是最好的倍数。因为一次性扩容太大(例如 2.5 倍)可能会浪费更多的内存(1.5 倍最多浪费 33%,而 2.5 被最多会浪费 60%,3.5 倍则会浪费 71%……)。但是一次性扩容太小,需要多次对数组重新分配内存,对性能消耗比较严重。所以 1.5 倍刚刚好,既能满足性能需求,也不会造成很大的内存消耗。

    处理这个 ensureCapacity() 这个扩容数组外,ArrayList 还给我们提供了将底层数组的容量调整为当前列表保存的实际元素的大小的功能。它可以通过 trimToSize() 方法来实现。该方法可以最小化 ArrayList 实例的存储量。

      public void trimToSize() {
                modCount++;
                int oldCapacity = elementData.length;
                if (size < oldCapacity) {
                    elementData = Arrays.copyOf(elementData, size);
                }
            }
    

      

  • 相关阅读:
    【卡西欧Fx-5800p系列教程】Pol()和Rec()正反算妙用
    《关于2013年全国测量人员最低工资标准的通知》
    易语言测量编程工具教程篇
    价值300元的《测量宝典》
    业界常用的和不常用cad快捷键
    角度格式批量转化弧度—易语言
    Web.config中 mode="RemoteOnly" 跟mode="On" 区别
    Oracle 批量修改某个用户下表的表空间
    JQuery radio单选框应用
    RadioButtonFor控件
  • 原文地址:https://www.cnblogs.com/sha0830/p/6138270.html
Copyright © 2011-2022 走看看