Java 是否正确使用list.remove?
假设我知道列表SomeList包含thatObj。以下代码是否从SomeList中删除对thatObj的引用Java 是否正确使用list.remove?,java,list,object,Java,List,Object,假设我知道列表SomeList包含thatObj。以下代码是否从SomeList中删除对thatObj的引用 SomeClass el = (SomeClass) thatObj.clone(); SomeList.remove(el); 无法通过引用找到此方法是否以某种方式比较了对象。直觉建议它应该使用Object.equals,如果引用指向同一个对象,它将返回true,因此此代码将不起作用 如果没有,那么还有一个问题:如果没有引用但知道所讨论对象的所有成员,如何从列表中删除?重写类上的eq
SomeClass el = (SomeClass) thatObj.clone();
SomeList.remove(el);
无法通过引用找到此方法是否以某种方式比较了对象。直觉建议它应该使用Object.equals,如果引用指向同一个对象,它将返回true,因此此代码将不起作用
如果没有,那么还有一个问题:如果没有引用但知道所讨论对象的所有成员,如何从列表中删除?重写类上的equals方法-下面是示例。也看看和 无法通过引用找到此方法是否以某种方式比较了对象。直觉建议它应该使用Object.equals,如果引用指向同一个对象,它将返回true,因此此代码将不起作用 是的,你说得对 如果没有,那么还有一个问题:如果没有引用,但知道所讨论对象的所有成员,如何从列表中删除 两种可能性:
- 重写类中的equals方法,创建一个包含所有已知成员的新实例,并将新创建的实例作为参数传递给
removecall
- 遍历列表中的所有对象,并删除成员与您拥有的值相等的对象
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;
}
公共布尔删除(对象o){
如果(o==null){
对于(int index=0;index
通过返回索引搜索列表以查找成员,然后获取对象并将其删除。也可以通过索引将其删除。代码
SomeList.indexOf()
可以帮助您获得覆盖
equals()
和hashCode()
的对象索引您的直觉完全正确(除非覆盖equals()
)。object.equals不考虑引用,它考虑了等于
的实现,而这恰好是标准地使用引用。如果您使用自己有意义的实现重写equals
,您可以删除具有不同引用的相同数据的对象。谢谢!你知道在哪里准确地描述了这一点吗?@IgorTraskunov:Oracle文档明确声明使用了equals
<代码>(o==null?get(i)==null:o.equals(get(i)))