我有一个仅包含两个元素的数组列表,我想将初始容量指定为 TWO,因为默认情况下初始容量为 10。
List<Integer> values = new ArrayList<integer>(2);
我会从中获得任何性能/内存优势吗?
任何讨论将不胜感激......
我有一个仅包含两个元素的数组列表,我想将初始容量指定为 TWO,因为默认情况下初始容量为 10。
List<Integer> values = new ArrayList<integer>(2);
我会从中获得任何性能/内存优势吗?
任何讨论将不胜感激......
除了内存使用量的少量减少外,您不会从中获得任何性能优势。
如果您确定大小正好是两个元素并且它永远不会改变,并且为了获得一点性能提升,只需使用原始类型数组(除非有一个非常好的理由更喜欢Integer
,anint
是一个更好的选择):
int[] values = new int[2];
更新
如果您需要存储混合类型,请使用Object[]
. ArrayList
如果大小固定为两个元素,它仍然是比使用更好的选择:
Object[] values = new Object[2];
看看这篇文章。编辑:某些列表在填充超过一定百分比(负载因子)后会调整大小,但 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;
希望有帮助!