在索引处添加到ArrayList时的IndexOutOfBoundsException

时间:2014-04-25 08:51:57

标签: java arraylist indexoutofboundsexception

我为以下代码获得了异常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)

10 个答案:

答案 0 :(得分:6)

ArrayList索引从0开始(零)

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

所以,简单地把它作为

 s.add("Elephant");

或者你可以

s.add(0,"Elephant");

答案 1 :(得分:5)

必须从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]

答案 2 :(得分:4)

您的ArrayList为空。有了这条线:

s.add(1,"Elephant");

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

使用

s.add("Elephant");

代替。

答案 3 :(得分:1)

如果您真的想在索引1处使用“Elephant”,那么您可以在索引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处指定elephant。

答案 4 :(得分:1)

适用于Android:

如果您需要使用会有很多差距的列表,最好在内存方面使用SparseArrayArrayList会有很多null个条目)。

使用示例:

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

如果你的列表将有超过数百个项目,最好使用HashMap,因为查找需要二进制搜索,并且添加和删除需要插入和删除数组中的条目。

答案 5 :(得分:0)

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<Integer>(10)时,您将列表的初始容量设置为10,而不是其大小。换句话说,当以这种方式构造时,数组列表的生命空白。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

不要在列表中直接添加索引1 如果你想在列表中添加值,请添加如下 s.add( “大象”); 默认情况下,列表大小为0 如果要在列表中添加任何元素,则大小会自动增加 你不能直接在列表第一索引中添加。 //s.add(0,“大象”);

答案 8 :(得分:0)

您可以通过以下方式初始化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)内以随机顺序添加元素。

答案 9 :(得分:0)

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

由于Arraylist的容量是可调的,因此只能使Java知道近似容量,并尽量避免由于容量扩展而导致的性能损失。