考虑以下两段代码:
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 - 但事实并非如此。
为什么不呢?
我应该怎样做才能add(index, "foo")
适用于index > strings.size()
?
答案 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将是你的最大数字。