2

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

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

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

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

4

2 回答 2

1

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

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

int[] values = new int[2];

更新

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

Object[] values = new Object[2];
于 2013-07-15T19:52:02.503 回答
0

看看这篇文章。编辑:某些列表在填充超过一定百分比(负载因子)后会调整大小,但 ArrayLists 似乎并非如此。

抱歉弄错了哈哈。让哈希表和动态数组有点困惑。

如果您真的想知道 ArrayLists 是如何工作的,请查看ArrayList 源代码。我认为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;

希望有帮助!

于 2013-07-15T19:55:32.777 回答