如果指定的Array List的容量只包含两个元素,是否有任何性能/内存优势?

时间:2013-07-15 19:47:46

标签: java collections

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

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

我可以获得任何性能/内存优势吗?

任何讨论都将受到赞赏......

2 个答案:

答案 0 :(得分:1)

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

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

int

<强>更新

如果您需要存储混合类型,请使用int[] values = new int[2]; 。如果大小固定为两个元素,它仍然是比使用Object[]更好的选择:

ArrayList

答案 1 :(得分:0)

结帐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;

希望有所帮助!