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:或者您在