Java 如果指定仅容纳两个元素的数组列表的容量,是否有任何性能/内存优势?
我有一个数组列表,它只包含两个元素,我想将初始容量指定为2,因为默认情况下初始容量是10Java 如果指定仅容纳两个元素的数组列表的容量,是否有任何性能/内存优势?,java,collections,Java,Collections,我有一个数组列表,它只包含两个元素,我想将初始容量指定为2,因为默认情况下初始容量是10 List<Integer> values = new ArrayList<integer>(2); 列表值=新的ArrayList(2); 我会从中获得性能/内存方面的好处吗 如果您能与我们进行任何讨论,我们将不胜感激……您将无法从中获得任何性能优势,除了极少量的内存使用减少 如果您确定大小正好是两个元素,并且它永远不会改变,并且为了获得一点性能提升,只需使用一个基元类型数组(除
List<Integer> values = new ArrayList<integer>(2);
列表值=新的ArrayList(2);
我会从中获得性能/内存方面的好处吗
如果您能与我们进行任何讨论,我们将不胜感激……您将无法从中获得任何性能优势,除了极少量的内存使用减少 如果您确定大小正好是两个元素,并且它永远不会改变,并且为了获得一点性能提升,只需使用一个基元类型数组(除非有非常好的理由选择
Integer
,否则int
是更好的选择):
更新
如果需要存储混合类型,请使用对象[]
。如果大小固定为两个元素,则它仍然是比使用ArrayList
更好的选择:
Object[] values = new Object[2];
退房。编辑:某些列表在填充超过一定百分比()后将调整大小,但ArrayList似乎不是这样
对不起,搞错了,哈哈。把哈希表和动态数组弄糊涂了
如果您真的想知道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 }
171/**
172*增加此ArrayList实例的容量,如果
173*必要,以确保其至少能容纳一定数量的元素
174*由最小容量参数指定。
175 *
176*@param minCapacity所需的最小容量
177 */
178公共空间容量(国际最小容量){
179 modCount++;
180 int oldCapacity=elementData.length;
181如果(最小容量>旧容量){
182对象oldData[]=elementData;
183新容量=(旧容量*3)/2+1;
184如果(新容量<最小容量)
185新容量=最小容量;
186//minCapacity通常接近大小,因此这是一个胜利:
187 elementData=Arrays.copyOf(elementData,newCapacity);
188 }
189 }
新的尺寸正好是:
int newCapacity=(旧容量*3)/2+1代码>
希望有帮助 您将有2个引用,而不是10个引用。为什么不简单地使用数组?如果确定元素的大小是固定的,则数组列表将与存储到其中的数据大小相匹配(默认值从10开始)。通过使用普通数组,您可以直接指定大小,这样就只有两个空间来存储元素。如果有差异,那么就很小了。引用数组的最小大小分配是16字节的倍数。如果您保存了32字节(8*4字节),您将节省0.00004美分的内存。你必须做很多事情才能考虑。一个ArrayList
没有加载因子,它只有在满后才会调整大小。如果我们创建一个size-2ArrayList
,除非添加更多元素,否则它将保持该大小。但是如果没有添加任何元素,为什么首先要使用ArrayList
?另外,“某些列表在填充超过一定百分比后将调整大小”的语句是错误的。负荷系数的概念适用于地图和集合,而不是列表。啊,我错了!散列不同于线性插入,但我认为列表可能会在满之前调整大小(以节省调整大小的时间)。我想这没有多大意义——抱歉搞混了!
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 }