1

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

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

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

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

4

4 回答 4

1

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

是的你是对的。

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

两种可能:

  • 覆盖类中的 equals 方法,使用所有已知成员创建一个新实例,并call删除将新创建的实例作为参数传递
  • 遍历列表中的所有对象并删除成员等于您拥有的值的对象
于 2013-11-01T17:17:58.163 回答
1

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

 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;
    }
于 2013-11-01T17:18:03.430 回答
0

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

SomeList.indexOf() 

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

于 2013-11-01T17:18:16.890 回答
0

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

于 2013-11-01T17:15:23.853 回答