我有一个数组列表,它只包含两个元素,我想将初始容量指定为TWO,因为默认情况下初始容量为10。
List<Integer> values = new ArrayList<integer>(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;
希望有所帮助!