Java.ArrayList。方法删除()
Posted
技术标签:
【中文标题】Java.ArrayList。方法删除()【英文标题】:Java.ArrayList. method remove() 【发布时间】:2011-05-21 22:03:48 【问题描述】:ArrayList 有 remove(int index)
和 remove(Object o)
,所以
我尝试运行以下代码: public static void main(String args[])
ArrayList<Long>ar=new ArrayList<Long>();
ar.add(11L);
ar.add(22L);
ar.add(33L);
ar.remove(new Integer(33)); // 1
byte b =0;
ar.remove(b); //2
for(Iterator i=ar.iterator(); i.hasNext();)
System.out.println(i.next());
结果我有:
22
33
我的问题:
在第 1 行参数 Integer - 为什么我们没有异常?
第 2 行 - 参数字节 - 它不是 int 也不是 Object,为什么又不是 Exception?
【问题讨论】:
所以,如果我对第 1 行的理解正确,我们会遇到这种情况:在我们的列表中,我们有 Long,所以当我们尝试运行 remove 方法时,我们有:If(Integer.equals(Long)) 返回false,我们的列表未修改。 和下一个。字节 -> 整数。这是正确的。但如果我这样做:long b =4654654654654654654L; long to int - 不可能。 【参考方案1】:remove(..)
方法不是通用的。它接受任何对象并且不检查其类。为了删除元素,它应该满足的条件是 equals(..)
方法在与集合中的元素进行比较时返回 true。元素 33 没有被移除,因为如果另一个对象不是 instanceof Long
,Long.equals(..)
返回 false
byte
被解释为索引。
【讨论】:
实际上问题第 2 部分的正确答案是 Java 将byte
原语自动装箱为 java.lang.Byte
对象并调用 ArrayList.remove(Object)
。 57:aload_1 58:iload_2 59:invokevirtual #15; //方法java/util/ArrayList.remove:(I)Ljava/lang/Object;
这是我最初的回答。但事实并非如此。【参考方案2】:
因为这两个都被转换为正确的类型。在第一个中,它是 remove(Object o),其中 o 是 Integer(33)。但它在您的数组列表中找不到该对象,因此它根据定义返回 false:
返回: 如果此列表包含指定的元素,则为 true。
第二个可能会转换为 int,因此您要删除第一个索引。
【讨论】:
【参考方案3】:1) 你传递了一个不在列表中的对象。所以什么都没有发生。
2) 传递的不是对象,而是索引(0)。所以arraylist中的第一个元素被删除了。
【讨论】:
#1 错误:remove(Object) 被调用,如果元素不是列表的一部分,则不会执行任何操作。如果索引超出范围,remove(int) 会抛出异常。 还是错了。Nothing happens
不太对,它返回 false。
好的。但列表没有任何反应。这就是问题所在。【参考方案4】:
Java 内置了自动装箱功能,可以节省您对各种数字表示进行类型转换的时间。没有错误,因为 Java 可以识别您的意思并为您转换。
【讨论】:
【参考方案5】:-
Integer 正在转换为 Object,因此不会引发异常。
我认为字节正在转换为 int 并被视为索引 0,因此删除了第一个值。
【讨论】:
【参考方案6】:看看javadocs。 ArrayList.remove 接受一个对象,而一个整数是一个对象。
[更新]忘记回答第二个问题了。
字节有效,因为我相信它要么是 autoboxed 到 Object 中,要么它被向上转换为 int 作为索引。
【讨论】:
以上是关于Java.ArrayList。方法删除()的主要内容,如果未能解决你的问题,请参考以下文章