为什么这段代码会抛出一个IndexOfOutBoundsException - 又名是什么,使用ensureCapacity()?

时间:2009-10-29 15:57:47

标签: java arraylist

考虑以下两段代码:

int index = 676;
List<String> strings = new ArrayList<String>();
strings.add(index, "foo");

int index = 676;
List<String> strings = new ArrayList<String>();
strings.ensureCapacity(index);
strings.add(index, "foo");

在第一种情况下,看到IndexOfOutBoundsException并不奇怪。 According to the API,如果索引超出范围add(int index, E element)(index < 0 || index > size())将抛出IndexOfOutBoundsException。在添加任何元素之前,strings的大小为0,因此index肯定会大于ArrayList的大小。

但是,在第二种情况下,我希望对ensureCapacity的调用增加strings,以便调用add将正确地在索引处插入字符串"foo" 676 - 但事实并非如此。

  1. 为什么不呢?

  2. 我应该怎样做才能add(index, "foo")适用于index > strings.size()

4 个答案:

答案 0 :(得分:3)

ArrayList中底层数组的容量与更高级别的List API方法(添加,删除等)不同,只能说明支持数组的大小。如果要允许在列表边界之外添加元素,则需要在实用程序类中自己编写代码(或找到为您执行此操作的集合),填充空值,空对象或应用程序在新索引和旧的大小。

答案 1 :(得分:2)

ArrayList.ensureCapacity()不会更改列表的实际大小(由size()返回),而是重新分配内部缓冲区,以便它不需要重新分配缓冲区以增长到此大小(当你调用list.add(object)。

/**
 * 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.
 */

答案 2 :(得分:2)

粗略猜测,我认为您正在寻找的是

Integer index = Integer.valueOf(676);
Map<Integer,String> strings = new HashMap<Integer,String>();
strings.put(index, "foo");

答案 3 :(得分:0)

你的长度是676,但你必须记住它们是零基础,所以实际上,你希望索引-1将是你的最大数字。