Java Eclipse中的Debug equals()和hashCode()

Java Eclipse中的Debug equals()和hashCode(),java,Java,我有下面的代码,我在ContainerBean的重写equals()和hashCode()方法上放置了断点。当我在调试模式下运行下面的应用程序时,调试器仅在System.out.println行的hashCode()处停止,而不是在尝试从列表中删除元素时停止 import java.util.ArrayList; import java.util.List; public class ListRemovalDriver { public static void main(String

我有下面的代码,我在
ContainerBean
的重写
equals()
hashCode()
方法上放置了断点。当我在调试模式下运行下面的应用程序时,调试器仅在
System.out.println
行的
hashCode()
处停止,而不是在尝试从
列表中删除元素时停止

import java.util.ArrayList;
import java.util.List;

public class ListRemovalDriver {

    public static void main(String[] args) {
        List<ContainerBean> remitClaims = new ArrayList<>();

        ContainedBean addedRemit1 = new ContainedBean();
        addedRemit1.setRemitId(12345L);
        ContainerBean added1 = new ContainerBean();
        added1.setRemitBean(addedRemit1);

        remitClaims.add(added1);

        ContainedBean removedRemit1 = new ContainedBean ();
        removedRemit1.setRemitId(12345L);
        ContainerBean removed1 = new ContainerBean ();
        removed1.setRemitBean(removedRemit1);

        System.out.println("List before valid removal" + remitClaims);

        remitClaims.remove(removed1);

        System.out.println("List after valid removal" + remitClaims);



    }
}
import java.util.ArrayList;
导入java.util.List;
公共类ListRemovalDriver{
公共静态void main(字符串[]args){
List=new ArrayList();
ContainedBean addedRet1=新ContainedBean();
addedRemit1.setRemitId(12345L);
ContainerBean added1=新的ContainerBean();
added1.setremotebean(addedRemit1);
汇出索赔。添加(增补1);
containedBeanRemovedReleg1=新ContainedBean();
RemovedRevied1.SetReviedID(12345L);
ContainerBean removed1=新的ContainerBean();
removed1.setremotebean(removedremote1);
System.out.println(“有效删除前列表”+汇款索赔);
免除索赔。移除(移除1);
System.out.println(“有效删除后的列表”+汇款索赔);
}
}
我错过什么了吗

从列表中删除元素时,是否不会调用
ContainerBean
中重写的
equals()

编辑


我忘了提到
hashCode()
equals()
正在按预期工作,即元素按照
equals()
逻辑被删除,但它是唯一一个没有将我带到列表删除函数调用中的调试器

来自jdk 7的ArrayList的源代码

ArrayList.remove(Object o)
它调用equals方法来验证要从集合中移除的对象

for (int index = 0; index < size; index++)
   if (o.equals(elementData[index])) {
        fastRemove(index);
        return true;
   }
}
for(int index=0;index

来源:

来自jdk 7的ArrayList的源代码

ArrayList.remove(Object o)
它调用equals方法来验证要从集合中移除的对象

for (int index = 0; index < size; index++)
   if (o.equals(elementData[index])) {
        fastRemove(index);
        return true;
   }
}
for(int index=0;index
资料来源:

在调用ContainerBean时是否不会调用ContainerBean中被重写的equals() 从列表中删除元素

是的,当您使用
remove(Object o)
时,将调用
ContainerBean
中的
equals()
检查对象的相等性,然后将其从列表中删除,如下面的
ArrayList
API所述(emphasis mine):

从此列表中删除指定元素的第一个匹配项, 如果有。如果列表不包含该元素,则为 不变。更正式地说,删除索引i最低的元素 使得(o==null?get(i)==null:o.equals(get(i))(如果这样的 元素存在)。如果此列表包含指定的 元素(或等效,如果此列表因 电话)

但是,另一方面,当您使用列表的索引(即使用
remove(int-index)
)删除元素时,将不会有任何
equals()
检查

你可以看看

在调用ContainerBean时是否不会调用ContainerBean中被重写的equals() 从列表中删除元素

是的,当您使用
remove(Object o)
时,将调用
ContainerBean
中的
equals()
检查对象的相等性,然后将其从列表中删除,如下面的
ArrayList
API所述(emphasis mine):

从此列表中删除指定元素的第一个匹配项, 如果有。如果列表不包含该元素,则为 不变。更正式地说,删除索引i最低的元素 使得(o==null?get(i)==null:o.equals(get(i))(如果这样的 元素存在)。如果此列表包含指定的 元素(或等效,如果此列表因 电话)

但是,另一方面,当您使用列表的索引(即使用
remove(int-index)
)删除元素时,将不会有任何
equals()
检查


您可以查看

,因为您没有给出我不得不猜测的代码:您没有覆盖equals,而是添加了如下重载:

public boolean equals(ContainerBean c) { ... }
这将不起作用,因为调用了equals(Object)


更改equals实现以获取Object类型的参数,它将在eclipse调试器中被调用并停止。

因为您没有给出代码,我不得不猜测:您没有重写equals,而是添加了如下重载:

public boolean equals(ContainerBean c) { ... }
这将不起作用,因为调用了equals(Object)


将equals实现更改为接受Object类型的参数,它将在eclipse调试器中被调用并停止。

我已经覆盖了它。将
对象
作为参数。然后必须显示代码
ArrayList.remove(Object)
调用
equals()
如果列表不是空的并且参数不是
null
。PS:或者您可能无意中在
ContainedBean
中的
equals()
上设置了断点,而不是
ContainerBean
?您应该在包含对
remove()
的调用的行上放置一个断点,然后单步执行该方法以找到答案。一旦我通过
remove
stepping进入,equals的断点开始工作。好像是Eclipse的问题,我已经解决了。将
对象
作为参数。然后必须显示代码
ArrayList.remove(Object)
调用
equals()
如果列表不为空且参数不为
null
.PS:或者您在