【问题标题】:Is there any performance/memory benefit if the capacity of Array List is being specified which is holding only two elements?如果指定仅包含两个元素的 Array List 的容量,是否有任何性能/内存优势?
【发布时间】:2013-07-15 19:47:45
【问题描述】:

我有一个仅包含两个元素的数组列表,我想将初始容量指定为 TWO,因为默认情况下初始容量为 10。

List<Integer> values = new ArrayList<integer>(2);

我会从中获得任何性能/内存优势吗?

任何讨论都将不胜感激......

【问题讨论】:

  • 您将拥有 2 个参考,而不是 10 个。
  • 为什么不简单使用数组呢?如果你确定你有固定大小的元素。
  • 一个数组列表将匹配您存储到其中的数据的大小(默认从 10 开始)。通过使用普通数组,您可以直接指定大小,以便只有两个空间用于存储元素。
  • 如果有区别,那是微不足道的。引用数组的最小分配大小应该是 16 字节的倍数。
  • 如果您节省了 32 字节(8 * 4 字节),您将节省 0.00004 美分的内存。你必须做很多值得思考的事情。

标签: java collections


【解决方案1】:

您不会从中获得任何性能优势,除了内存使用量的非常小的减少。

如果您确定大小正好是两个元素并且它永远不会改变,并且为了获得一点性能提升,只需使用原始类型数组(除非有充分的理由更喜欢 Integerint 是更好的选择):

int[] values = new int[2];

更新

如果您需要存储混合类型,请使用Object[]。如果大小固定为两个元素,它仍然比使用ArrayList 更好:

Object[] values = new Object[2];

【讨论】:

    【解决方案2】:

    查看this post。编辑:某些列表在填充超过一定百分比 (load factor) 后会调整大小,但 ArrayLists 似乎并非如此。

    抱歉错了哈哈。让哈希表和动态数组有点混乱。

    如果您真的想了解 ArrayLists 的工作原理,请查看ArrayList source code。我认为确定是否需要调整后备数组大小的ensureCapacity() 方法:

      171     /**
      172      * Increases the capacity of this <tt>ArrayList</tt> instance, if
      173      * necessary, to ensure that it can hold at least the number of elements
      174      * specified by the minimum capacity argument.
      175      *
      176      * @param   minCapacity   the desired minimum capacity
      177      */
      178     public void ensureCapacity(int minCapacity) {
      179         modCount++;
      180         int oldCapacity = elementData.length;
      181         if (minCapacity > oldCapacity) {
      182             Object oldData[] = elementData;
      183             int newCapacity = (oldCapacity * 3)/2 + 1;
      184             if (newCapacity < minCapacity)
      185                 newCapacity = minCapacity;
      186             // minCapacity is usually close to size, so this is a win:
      187             elementData = Arrays.copyOf(elementData, newCapacity);
      188         }
      189     }
    

    而新的尺寸恰好是: int newCapacity = (oldCapacity * 3)/2 + 1;

    希望有帮助!

    【讨论】:

    • 一个ArrayList 没有一个负载因子,它只会在它满后调整大小。如果我们创建一个 size-2 ArrayList 它将保持该大小,除非向其中添加更多元素。但是,如果永远不会添加任何元素,为什么首先要使用 ArrayList
    • 此外,“某些列表将在填充超过一定百分比后调整大小”的说法是错误的。负载因子的概念适用于地图和集合,而不是列表。
    • 啊,我的错!散列与线性插入不同,但我认为列表可能会在它们满之前调整大小(以节省调整大小的时间)。我想这没有多大意义 - 很抱歉造成混乱!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2021-04-26
    • 2011-12-18
    相关资源
    最近更新 更多