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");