Java ArrayList移除对象-IndexOutOfBoundsException
我试图从ArrayList中删除一个对象,但我一直得到一个IndexOutOfBounds错误。现在有很多信息可以解释为什么在删除的同时在ArrayList上迭代,会发生这种情况,但是我没有这样做。 例如:Java ArrayList移除对象-IndexOutOfBoundsException,java,arraylist,Java,Arraylist,我试图从ArrayList中删除一个对象,但我一直得到一个IndexOutOfBounds错误。现在有很多信息可以解释为什么在删除的同时在ArrayList上迭代,会发生这种情况,但是我没有这样做。 例如: ArrayList<Character> a = new ArrayList<Character>(); a.add('A'); a.add('B'); a.add('C'); System.out.println(a); a.remove('A');
ArrayList<Character> a = new ArrayList<Character>();
a.add('A');
a.add('B');
a.add('C');
System.out.println(a);
a.remove('A');
System.out.println(a);
为什么会这样
编辑以澄清此问题不是重复的:
这里出现的具体问题与迭代时删除元素时的常见问题无关。这是由重载的ArrayListremove
方法和java自动将char
类型转换为int
引起的
另一个问题的答案中没有涉及这方面。删除方法需要一个索引,并在指定索引处删除一项。您正在传递一个字符,因此它被转换为一个整数65
a.remove()
期望为要删除的项的索引获取一个整数。'A'返回A的ASCII值,该值为64,因此超出了数组的界限有2个重载的
remove
方法--,以及,删除对象引用本身
介绍Java如何选择一种方法重载而不是另一种方法重载
这些阶段是:
char
可以提升为int
,但也可以将其装箱为字符
,与的类型参数匹配。但是Java会在任何需要装箱的方法之前单独选择升级,因此'A'
被升级为int
,因此值为65
如果要按对象引用删除,可以将其显式强制转换为字符
a.remove((Character) 'A');
应将索引传递给Arraylist的remove方法。试着换这条线
a、 删除(“a”);与
a、 移除(0) 类有两个方法remove
的重载。一个带有整数参数,用于删除该索引处的项,另一个带有对象
参数
您正在传递一个char
。这既不是int
也不是对象
。因此,编译器必须决定使用哪个删除:是将字符提升为int
,还是将其装箱为字符,然后提升为对象
Java中的重载解析总是在不考虑装箱和取消装箱的情况下启动。因此,它优先考虑remove(int)
重载。因此,它接受字符A
的值,即65,并将其提升为int,这意味着当列表只有三个项目时,它将尝试删除项目#65
要解决这个问题,您需要明确告诉它使用字符
对象,如:remove(Character.valueOf('a'))
您要使用a.remove(0)代码>尝试:a.remove((字符)'a')
我特别想删除一个对象,而不是索引,如本文所述:是的,但是'a'
是一个基本类型,因此remove(int-index)
被用来代替remove(object o)
@Jarrod Roberson您提到的重复问题并没有回答我的问题。我完全了解在迭代和删除元素时可能出现的问题,但是我的问题的答案是,删除方法重载,并且从char到int的类型升级导致失败。实际上,A是65,就像在异常消息中一样。它不是真正的ASCII值,而是UTF-16代码点,恰好与拉丁1值相同,恰好与ASCII值相同。人们说代码点是ASCII值,这有点让我恼火。@DavidConrad我完全同意你的观点,但我想你的意思是说UTF-16代码单元。代码点是绝对的,不是编码。@Klitos谢谢。我确实应该说是代码单元。那会删除'B'
。
a.remove((Character) 'A');