我是否正确使用list.remove?

时间:2013-11-01 17:13:48

标签: java list object

假设我知道列表SomeList包含thatObj。以下代码是否删除了SomeList中对thatObj的引用?

SomeClass el = (SomeClass) thatObj.clone();
SomeList.remove(el);

如果此方法以某种方式比较对象,则无法通过引用找到。 Intuition建议它应该使用Object.equals,如果引用指向同一个对象,它返回true,因此这段代码不起作用。

如果没有那么另外一个问题:如果没有引用但如何知道该对象的所有成员,如何从列表中删除?

4 个答案:

答案 0 :(得分:1)

  

如果此方法以某种方式比较对象,则无法通过引用找到。 Intuition建议它应该使用Object.equals,如果引用指向同一个对象,它返回true,因此这段代码不起作用。

是的,你是对的。

  

如果没有那么另外一个问题:如果没有引用但如何知道该对象的所有成员,如何从列表中删除?

两种可能性:

  • 覆盖您的类中的equals方法,创建一个包含所有已知成员的新实例,并call删除将新创建的实例作为参数传递
  • 遍历列表中的所有对象,并删除成员等于您拥有的值的对象

答案 1 :(得分:1)

remove方法在内部使用equals方法检查列表中的对象。如果equal返回true,那么它将被删除。覆盖equals方法将允许正确删除对象。这里有一个ArrayList删除方法的代码供你参考:

 public boolean remove(Object o) {
    if (o == null) {
            for (int index = 0; index < size; index++)
        if (elementData[index] == null) {
            fastRemove(index);
            return true;
        }
    } else {
        for (int index = 0; index < size; index++)
        if (o.equals(elementData[index])) {
            fastRemove(index);
            return true;
        }
        }
    return false;
    }

答案 2 :(得分:0)

覆盖类上的equals方法 - 这是javadoc。另请查看Overriding the java equals() method quirkOverriding equals and hashCode in Java

答案 3 :(得分:0)

通过返回索引搜索列表以查找成员,然后获取对象并将其删除。您也可以通过索引删除它。代码

SomeList.indexOf() 

可以帮助您获取覆盖equals()hashCode()的对象的索引。