假设我知道列表SomeList包含thatObj。以下代码是否删除了SomeList中对thatObj的引用?
SomeClass el = (SomeClass) thatObj.clone();
SomeList.remove(el);
如果此方法以某种方式比较对象,则无法通过引用找到。 Intuition建议它应该使用Object.equals,如果引用指向同一个对象,它返回true,因此这段代码不起作用。
如果没有那么另外一个问题:如果没有引用但如何知道该对象的所有成员,如何从列表中删除?
答案 0 :(得分:1)
如果此方法以某种方式比较对象,则无法通过引用找到。 Intuition建议它应该使用Object.equals,如果引用指向同一个对象,它返回true,因此这段代码不起作用。
是的,你是对的。
如果没有那么另外一个问题:如果没有引用但如何知道该对象的所有成员,如何从列表中删除?
两种可能性:
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 quirk和Overriding equals and hashCode in Java。
答案 3 :(得分:0)
通过返回索引搜索列表以查找成员,然后获取对象并将其删除。您也可以通过索引删除它。代码
SomeList.indexOf()
可以帮助您获取覆盖equals()
和hashCode()
的对象的索引。