Java 如果指定仅容纳两个元素的数组列表的容量,是否有任何性能/内存优势?

Java 如果指定仅容纳两个元素的数组列表的容量,是否有任何性能/内存优势?,java,collections,Java,Collections,我有一个数组列表,它只包含两个元素,我想将初始容量指定为2,因为默认情况下初始容量是10 List<Integer> values = new ArrayList<integer>(2); 列表值=新的ArrayList(2); 我会从中获得性能/内存方面的好处吗 如果您能与我们进行任何讨论,我们将不胜感激……您将无法从中获得任何性能优势,除了极少量的内存使用减少 如果您确定大小正好是两个元素,并且它永远不会改变,并且为了获得一点性能提升,只需使用一个基元类型数组(除

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

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-2
ArrayList
,除非添加更多元素,否则它将保持该大小。但是如果没有添加任何元素,为什么首先要使用
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     }