Java 是否正确使用list.remove?

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

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

SomeClass el = (SomeClass) thatObj.clone();
SomeList.remove(el);
无法通过引用找到此方法是否以某种方式比较了对象。直觉建议它应该使用Object.equals,如果引用指向同一个对象,它将返回true,因此此代码将不起作用


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

重写类上的equals方法-下面是示例。也看看和

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

是的,你说得对

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

两种可能性:

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

  • 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)))