当我们创建一个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());
答案 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