java arraylist ensureCapacity不工作

java arraylist ensureCapacity不工作,java,arraylist,Java,Arraylist,要么我做错了,要么我不理解这个方法是如何工作的 ArrayList<String> a = new ArrayList<String>(); a.ensureCapacity(200); a.add(190,"test"); System.out.println(a.get(190).toString()); ArrayList a=新的ArrayList(); a、 保证能力(200); a、 添加(190,“测试”); System.out.println(a.ge

要么我做错了,要么我不理解这个方法是如何工作的

ArrayList<String> a = new ArrayList<String>();
a.ensureCapacity(200);
a.add(190,"test");
System.out.println(a.get(190).toString());
ArrayList a=新的ArrayList();
a、 保证能力(200);
a、 添加(190,“测试”);
System.out.println(a.get(190.toString());
我本以为ensureCapacity会让我插入一个索引达到该值的记录。有没有其他方法可以做到这一点


第三行出现IndexOutOfBounds错误。

否,
ensureCapacity
不会更改
ArrayList
的逻辑大小-它会更改容量,即列表在下次需要复制值之前可以达到的大小

您需要非常清楚逻辑大小(即范围
[0,size)
中的所有值都是可访问的,添加新元素会将其添加到索引
size
)和容量之间的差异,而容量实际上更像是一个实现细节——它是用于存储的备份阵列的大小

调用
ensureCapacity
只会对性能产生任何影响(通过避免过度复制)-如果您明白我的意思,它不会影响列表中内容的逻辑模型

编辑:听起来您需要一种
ensureSize()
方法,它可能如下所示:

public static void ensureSize(ArrayList<?> list, int size) {
    // Prevent excessive copying while we're adding
    list.ensureCapacity(size);
    while (list.size() < size) {
        list.add(null);
    }
}
publicstaticvoid调整大小(ArrayList列表,int-size){
//在添加时防止过度复制
列表。保证能力(大小);
while(list.size()
确保容量不会将项目添加到列表中。如果已经添加了191个元素,则只能获取元素190或在元素190处添加。“容量”只是ArrayList在需要调整其内部数据结构(数组)之前可以容纳的对象数。如果ArrayList具有getCapacity(),则执行以下操作:

ArrayList<String> a = new ArrayList<String>();
a.ensureCapacity(200);
System.out.println(a.size());
System.out.println(a.getCapacity());
ArrayList a=新的ArrayList();
a、 保证能力(200);
System.out.println(a.size());
System.out.println(a.getCapacity());

将分别打印出0和大于或等于200的数字

再次打印JavaDoc以澄清情况:

Throws: IndexOutOfBoundsException 
    - if index is out of range (index < 0 || index > size()).
抛出:IndexOutOfBoundsException
-如果索引超出范围(索引<0 | |索引>大小()。

请注意,
size()
返回列表当前保留的元素数。

ArrayList将其容量(内部数组的大小)与其大小(添加的元素数)分开维护,而“set”方法取决于已分配给元素的索引。无法设置大小。如果需要,可以添加带循环的虚拟元素:

for (int i = 200; --i >= 0;) a.add(null);

ensureCapacity
只确保基础数组的容量大于或等于参数。它不会更改
ArrayList
的大小。它不会通过API显示任何更改,因此您不会注意到任何差异,除非在调整
ArrayList
大小之前可能会更长它是内部数组。

所以正如其他人提到的
ensureCapacity
不适用于此。 看起来您希望从200个空值的
ArrayList
开始?那么这将是最简单的方法:

ArrayList<String> a = new ArrayList<String>(Arrays.asList( new String[200] ));
这与

a.add(190, "test");
这将在索引190中添加“test”,并将其他9个元素上移,从而生成大小为201的列表


如果您知道总是有200个元素,那么最好只使用一个数组。

将190个空条目添加到ArrayList中,这意味着滥用了数据结构

  • 考虑使用标准基元数组

  • >P>如果您需要泛型或更有效地使用空间,则考虑<代码> SpasRays或者甚至<<代码> map < /C> >像<代码> HashMap < /C> >可能适合您的用途。

    公共静态void fillArrayList(ArrayList ArrayList,长尺寸){
    对于(int i=0;i
    根据我看到的结果,我就是这么想的……但是有什么方法可以做我需要做的吗?如果你真的想在位置190上放置单个项目,可以使用数组,或者使用不同的类而不是数组列表?没错,伙计们:我纠正了一个拼写错误。这无疑是我职业生涯的顶点。我的游行结束了。谢谢Jon。现在我我必须想办法告诉我的孩子;)+1,但我只是举了一个简单的例子,因为和我的实际情况相同的原因导致了同样的错误。谢谢。
    a.add(190, "test");
    
      public static void fillArrayList(ArrayList<String> arrayList, long size) {
        for (int i = 0; i < size + 1; i++) {
          arrayList.add(i,"-1");
        }
      }
    
    public static void main(String[] args) throws Exception {
      ArrayList<String> a = new ArrayList<String>(10);
      fillArrayList(a, 190);
      a.add(190,"test");
      System.out.println(a.get(190).toString());
    }