在索引处添加到 ArrayList 时出现 IndexOutOfBoundsException

Posted

技术标签:

【中文标题】在索引处添加到 ArrayList 时出现 IndexOutOfBoundsException【英文标题】:IndexOutOfBoundsException when adding to ArrayList at index 【发布时间】:2014-06-10 21:24:07 【问题描述】:

以下代码出现异常Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0。但不明白为什么。

public class App 
    public static void main(String[] args) 
        ArrayList<String> s = new ArrayList<>();

        //Set index deliberately as 1 (not zero)
        s.add(1,"Elephant");

        System.out.println(s.size());                
    

更新

我可以让它工作,但我试图理解这些概念,所以我将声明更改为下面但也没有工作。

ArrayList<String> s = new ArrayList<>(10)

【问题讨论】:

如果您仔细阅读堆栈跟踪,您会看到错误是在添加时,而不是在请求大小时。我已经相应地编辑了你的标题。 你说得对,我看到了异常at java.util.ArrayList.add 【参考方案1】:

顺便说一句,ArrayList&lt;String&gt; s = new ArrayList&lt;&gt;(10); 将 initialCapacity 设置为 10。

由于Arraylist的容量是可调的,它只让java知道大概的容量,尽量避免扩容带来的性能损失。

【讨论】:

【参考方案2】:

你可以这样初始化一个ArrayList的大小(不是容量):

ArrayList<T> list = new ArrayList<T>(Arrays.asList(new T[size]));

在你的情况下:

ArrayList<String> s = new ArrayList<String>(Arrays.asList(new String[10]));

这将创建一个包含 10 个空元素的 ArrayList,因此您可以在大小(索引 0-9)内以随机顺序添加元素。

【讨论】:

Arrays.asList(new String[10]) - 已经返回一个列表。所以把它包起来有点没用。变量 s 应该是原始类型 List,而不是实现 ArrayList。 OP专门询问了ArrayList,Arrays.asList返回一个固定大小的List(***.com/questions/2965747/…) 使用接口肯定是更好的做法,但我们不知道OP是否需要ArrayList的特定方法 @Bojan Petkovic,Arrays.asList(new String[10]) 将返回一个 AbstractList。 AbstractList 不支持操作 add(index, value)。所以它需要被包装(通过非抽象类型的 List 实现)。 @imnd_neel ArrayList 没有实现 List 的 AbstractList 不支持的单一方法。 List 支持 add(index, value):docs.oracle.com/javase/8/docs/api/java/util/… List strings = Arrays.asList(new String[10]);应该够了。【参考方案3】:

ArrayList 索引从 0(零)开始

您的数组列表大小为 0,并且您在第一个索引处添加字符串元素。如果不在第 0 个索引处添加元素,则无法添加下一个索引位置。这是错误的。

所以,简单地把它变成

 s.add("Elephant");

或者你可以

s.add(0,"Elephant");

【讨论】:

【参考方案4】:

对于 Android:

如果您需要使用一个有很多空白的列表,最好使用SparseArray 以存储内存(ArrayList 将有很多null 条目)。

使用示例:

SparseArray<String> list = new SparseArray<>();
list.put(99, "string1");
list.put(23, "string2");
list.put(45, "string3");
如果您添加顺序键,例如 1、2、3、5、7、11、13...,请使用 list.append()。 如果您添加非顺序键,例如 100、23、45、277、42...,请使用 list.put()

如果您的列表将包含数百个项目,最好使用HashMap,因为查找需要二进制搜索,而添加和删除需要在数组中插入和删除条目。

【讨论】:

【参考方案5】:

add(int index, E element) API 说,您的数组列表大小为零,并且您正在向第一个索引添加一个元素

投掷:

IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())

请改用boolean add(E e)

更新基于问题更新

我可以让它工作,但我正在努力理解这些概念,所以我 将声明更改为下面,但也没有用。

ArrayList<String> s = new ArrayList<>(10)

当您调用new ArrayList&lt;Integer&gt;(10) 时,您将列表的初始容量设置为 10,而不是其大小。换句话说,当以这种方式构造时,数组列表的生命开始时是空的。

【讨论】:

这就是我迷失方向的地方。我的索引1 不小于零,大小为1,因此索引不大于大小。【参考方案6】:

不要在列表中直接将索引添加为 1 如果您想在列表中添加值,请像这样添加 s.add("大象"); 默认列表大小为 0 如果您将在列表中添加任何元素,大小将自动增加 您不能直接在列表第一个索引中添加。 //s.add(0, "大象");

【讨论】:

【参考方案7】:

您必须从 0、1 等开始向 ArrayList 连续添加元素。

如果您需要将元素添加到特定位置,您可以执行以下操作 -

String[] strings = new String[5];
strings[1] = "Elephant";

List<String> s = Arrays.asList(strings);
System.out.println(s); 

这将产生sollowing输出

[null, Elephant, null, null, null]

【讨论】:

【参考方案8】:

如果你真的想在索引 1 处添加“大象”,那么你可以在索引 0 处添加另一个(例如 null)条目。

public class App 
public static void main(String[] args) 
    ArrayList<String> s = new ArrayList<>();

    s.add(null);
    s.add("Elephant");

    System.out.println(s.size());                
  

或者将调用更改为 .add 以在索引 0 处指定 null 并在索引 1 处指定大象。

【讨论】:

【参考方案9】:

ArrayList 不能自扩展。要在索引 1 处添加项目,您应该有元素 #0。

【讨论】:

【参考方案10】:

您的ArrayList 为空。用这一行:

s.add(1,"Elephant");

您试图在不存在的ArrayList(第二个位置)的索引1 处添加"Elephant",因此它会抛出一个IndexOutOfBoundsException

使用

s.add("Elephant");

改为。

【讨论】:

我换成ArrayList&lt;String&gt; s = new ArrayList&lt;&gt;(10)怎么样 @Bala 它会给你一个IndexOutOfBoundsException。该构造函数设置ArrayList 的初始容量,而不是大小。所以大小仍然是 0。并且来自 API:Throws IndexOutOfBoundsException if the index is out of range (index &lt; 0 || index &gt; size())

以上是关于在索引处添加到 ArrayList 时出现 IndexOutOfBoundsException的主要内容,如果未能解决你的问题,请参考以下文章

尝试将相同的字符串添加到 ArrayList 类时出现 nullpointerexception [重复]

滚动时将新项目添加到列表时出现数组索引超出范围异常

ArrayList - 如何检查索引是不是存在?

运行时出现该字符串未被识别为有效的 DateTime。有一个从索引 0 处开始的未知字。

添加联系人时出现 OperationApplicationException

Oracle:使用 to_lob 从 user_ind_expressions 转换 column_expression 时出现 ORA-00932