1

发现了一个关于 ArrayList 的有趣的事情,

ArrayList<String> list = new ArrayList<String>();
list.add(0, "0-element");
list.add(1, "1-element");
list.add(2, "2-element");

但是,如果元素不是以未知的顺序出现的,例如。

ArrayList<String> list = new ArrayList<String>();
list.add(1, "1-element");  // IndexOutOfBoundsException
list.add(2, "2-element");
list.add(0, "0-element");

你得到 IndexOutOfBoundsException,这里唯一的选择是使用 Map 而不是 List?

4

7 回答 7

4

或多或少,是的。您不能List处于 index 有元素i但没有i-1;的状态。您不能在当前不存在的索引处添加元素List

于 2012-11-26T17:45:32.773 回答
3

如果您阅读javadoc,它会说:

在此列表中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将其索引加一)。
抛出IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())

因此,在您的第一个示例中,列表为空,并且在位置 0 中插入了一个元素(该元素尚不存在,但它是第一个可用的 - index = 0 <= size() = 0)。

在您的第二个示例中,您尝试插入位置 1,但位置 0 中没有任何内容,因此它失败(索引 = 1 > size() = 0)。

于 2012-11-26T17:45:44.290 回答
1

只需检查addArrayList 中的方法实现即可得到答案

public void add(int index, E element) {
    if (index > size || index < 0)
        throw new IndexOutOfBoundsException(
        "Index: "+index+", Size: "+size);

    ensureCapacity(size+1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,
             size - index);
    elementData[index] = element;
    size++;
}
于 2012-11-26T17:47:42.417 回答
1

简单使用

list.add("element1");
list.add("element2");
list.add("element3);

您得到 IndexOutOfBoundsException 的原因是您想要访问尚不存在的元素 1。

来自 ArrayList 文档

Throws:
IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())
于 2012-11-26T17:49:09.920 回答
1

这是记录在案的:

IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())

您可以在添加之前进行测试:

if (pos>=list.size()) list.add(element);
else list.add(pos, element);  

但是你所做的很奇怪(这就是为什么没有方法进行测试和添加/插入的原因)。您真的要在索引处添加(即移动一些先前插入的元素)吗?你确定一个标准数组,允许你在任意索引处设置元素不是你需要的吗?

于 2012-11-26T17:45:42.907 回答
0

如果您的列表不包含重复项,并且您不关心订单,那么您可以使用Set<String>

于 2012-11-26T17:44:58.073 回答
0

首先你应该使用ArrayListas List

List<String> list = new ArrayList<String>();
list.add("...");

我认为你也应该使用 aSet而不是 a List

于 2012-11-26T17:45:58.077 回答