【问题标题】:IndexOutOfBoundsException when adding to ArrayList at index在索引处添加到 ArrayList 时出现 IndexOutOfBoundsException
【发布时间】: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

标签: java arraylist indexoutofboundsexception


【解决方案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(stackoverflow.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())
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-11
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多