Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这段代码抛出IndexOfOutBoundsException-aka,what';ensureCapacity()是怎么回事?_Java_Arraylist - Fatal编程技术网

Java 为什么这段代码抛出IndexOfOutBoundsException-aka,what';ensureCapacity()是怎么回事?

Java 为什么这段代码抛出IndexOfOutBoundsException-aka,what';ensureCapacity()是怎么回事?,java,arraylist,Java,Arraylist,考虑以下两段代码: int index = 676; List<String> strings = new ArrayList<String>(); strings.add(index, "foo"); int索引=676; 列表字符串=新的ArrayList(); 添加(索引,“foo”); 及 int索引=676; 列表字符串=新的ArrayList(); 字符串。确保资本充足率(索引); 添加(索引,“foo”); 在第一种情况下,看到IndexOfOutBo

考虑以下两段代码:

int index = 676;
List<String> strings = new ArrayList<String>();
strings.add(index, "foo");
int索引=676;
列表字符串=新的ArrayList();
添加(索引,“foo”);

int索引=676;
列表字符串=新的ArrayList();
字符串。确保资本充足率(索引);
添加(索引,“foo”);
在第一种情况下,看到IndexOfOutBoundsException,我并不感到惊讶
add(int index,E element)
将抛出IndexOfOutBoundsException“如果索引超出范围
(index<0 | | index>size())
”。在添加任何元素之前,
字符串的大小为0,因此索引肯定会大于ArrayList的大小

但是,在第二种情况下,我希望对
ensureCapacity
的调用会增加
strings
,这样对
add
的调用会在索引676处正确插入字符串
“foo”
,但它不会

  • 为什么不呢

  • 我应该怎么做才能使
    add(index,“foo”)
    适用于
    index>strings.size()


  • ArrayList中底层数组的容量不同于更高级别的列表API方法(添加、删除等),并且只与支持数组的大小有关。如果希望允许添加列表边界以外的元素,则需要在实用程序类中自己编写(或找到一个为您编写的集合),在新索引和旧索引之间填充null、空对象或应用程序期望的任何内容。

    ArrayList.ensureCapacity()不会更改列表的实际大小(由size()返回),而是重新分配内部缓冲区,使其无需重新分配缓冲区即可增长到此大小(当您调用list.add(object)时)

    /**
    *如果需要,请增加此ArrayList实例的容量
    *必要时,确保它至少可以容纳元素的数量
    *由最小容量参数指定。
    */
    
    随便猜一猜,我想你要找的是

    Integer index = Integer.valueOf(676);
    Map<Integer,String> strings = new HashMap<Integer,String>();
    strings.put(index, "foo");
    
    Integer index=Integer.valueOf(676);
    Map strings=newhashmap();
    put(索引,“foo”);
    
    您的长度是676,但您必须记住它们是以零为基础的,因此在现实中,您希望索引-1是您的最大值。

    这是正确的答案。
    ensureCapacity()
    方法是出于性能原因而存在的。允许
    ArrayList
    在添加新元素时自动调整备份数组的大小在某些情况下可能会很慢,因为每次新列表长度超过备份数组的长度时都必须重新分配数组。使用
    ensureCapacity()
    可以说“我将有至少N个元素,所以从N个元素的后备数组开始。”有趣的是,你应该提到这一点。我开始使用地图,在漫长的一天编码过程中,云思维最终切换到列表(昨晚).在完成调整列表大小的一半后,我刚刚切换回地图。
    /**
     * Increases the capacity of this <tt>ArrayList</tt> instance, if
     * necessary, to ensure that it can hold at least the number of elements
     * specified by the minimum capacity argument.
     */
    
    Integer index = Integer.valueOf(676);
    Map<Integer,String> strings = new HashMap<Integer,String>();
    strings.put(index, "foo");