从列表中删除项目后,Java ArrayList引发IndexOutOfBoundsException

时间:2018-08-02 13:24:42

标签: java collections

当我们创建一个ArrayList并检查其大小时,它的值为0。但是,当我们添加一个元素并删除该元素,然后检查其大小时,它将引发异常。

remove()方法的内部实现是什么,它可以更改空列表的定义?

下面的代码将输出设置为0。

List<Integer> list2 = new ArrayList<Integer>();
System.out.println(list2.size());

下面的代码引发异常:

List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
System.out.println(list1.size());
list1.remove(1);
System.out.println(list1.size());

6 个答案:

答案 0 :(得分:3)

remove中有两个List方法。有remove(int index)和有remove(Object o)

如果您调用remove(1),它将解析为remove(int index),并尝试删除列表中索引1处的项目(超出范围)。

如果您要从列表中删除对象1,请通过调用

确保编译器知道您的意思remove(Object)
remove((Integer) 1)

由于Integer是对象,因此将调用remove(Object)

答案 1 :(得分:1)

您之所以会感到困惑,是因为List#add()将传递给它的参数添加到了最初的第一个索引为零的位置。另一方面,List#remove(int index)会在您指定的索引处删除项目。由于您指定的是索引1,因此代码会失败并出现异常。

这可能是您打算做的:

List<Integer> list1 = new ArrayList<>();
list1.add(1);
System.out.println(list1.size());
list1.remove(0);
System.out.println(list1.size());  // should print 0, with no exception

答案 2 :(得分:0)

remove(int index)

索引,而不是值...

答案 3 :(得分:0)

list1.remove(1)

您正尝试从索引1中删除一个元素,而不是值1。因此,数组索引超出范围错误。

答案 4 :(得分:0)

list1.add(1);  将1添加到arraylist list1中,但在

list1.remove(1);

将删除数组列表的索引1(第二个位置,因为ArrayList索引从0开始)中的值。

做到

list1.remove(0)

并且可以工作。

答案 5 :(得分:0)

您的逻辑有问题。

List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
System.out.println(list1.size());
list1.remove(1);
System.out.println(list1.size());

您将整数值添加到list.so会将大小打印为1.但是随后您从列表中删除了该值。当您从列表中删除某项时,可以使用int索引调用remove(),这是一种方法。因此,您必须插入相关值的索引,而不是该值。那么您会看到没有属于索引号1的值。仅存在索引号0。因此它将抛出数组索引超出范围的异常。有关更多详细信息,请oracle docs