当我运行此代码时,为什么只调用hashCode()而不是equals方法,而我的hashCode()实现生成相同的HashSet的两个条目的hashCode?importjava.util.HashSet;publicclassTest1{publicstaticvoidmain(String[]args){Studentst=newStudent(89);HashSetst1=newHashSet();st1.add(st);st1.add(st);System.out.println("Hosize="+st1.size());}}classStudent{privateintna
Eclipse源菜单有一个“生成hashCode/equals方法”,它可以生成如下所示的函数。Stringname;@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+((name==null)?0:name.hashCode());returnresult;}@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getC
Eclipse源菜单有一个“生成hashCode/equals方法”,它可以生成如下所示的函数。Stringname;@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+((name==null)?0:name.hashCode());returnresult;}@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getC
我定义了两个类,它们都包含对另一个对象的引用。它们看起来与此类似(这是简化的;在我的真实域模型中,A包含一个B列表,每个B都有一个对父A的引用):publicclassA{publicBb;publicStringbKey;@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+((b==null)?0:b.hashCode());result=prime*result+((bKey==null)?0:bKey.hashCode());returnresult;}@Overridepub
我定义了两个类,它们都包含对另一个对象的引用。它们看起来与此类似(这是简化的;在我的真实域模型中,A包含一个B列表,每个B都有一个对父A的引用):publicclassA{publicBb;publicStringbKey;@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+((b==null)?0:b.hashCode());result=prime*result+((bKey==null)?0:bKey.hashCode());returnresult;}@Overridepub
如何测试unittesting中的hashCode()函数?publicinthashCode(){intresult=17+hashDouble(re);result=31*result+hashDouble(im);returnresult;} 最佳答案 每当我重写equals和hash代码时,我都会按照JoshuaBloch在“EffectiveJava”第3章中的建议编写单元测试。我确保equals和hash代码是自反的、对称的和传递的。我还确保“不等于”适用于所有数据成员。当我检查对equals的调用时,我还确保hashC
如何测试unittesting中的hashCode()函数?publicinthashCode(){intresult=17+hashDouble(re);result=31*result+hashDouble(im);returnresult;} 最佳答案 每当我重写equals和hash代码时,我都会按照JoshuaBloch在“EffectiveJava”第3章中的建议编写单元测试。我确保equals和hash代码是自反的、对称的和传递的。我还确保“不等于”适用于所有数据成员。当我检查对equals的调用时,我还确保hashC
我有一系列具有long字段的对象,该字段的值唯一标识整个系统中的特定对象,很像GUID。我已经覆盖了Object.equals()以使用此id进行比较,因为我希望它与对象的副本一起使用。现在我也想覆盖Object.hashCode(),这基本上意味着将我的long映射到某个int返回值。如果我正确理解了hashCode的用途,它主要用于哈希表,因此需要均匀分布。这意味着,只需返回id%2^32就足够了。仅此而已,还是我应该注意其他事情? 最佳答案 从Java8开始你可以使用Long.hashCode(guid);对于旧版本的Java
我有一系列具有long字段的对象,该字段的值唯一标识整个系统中的特定对象,很像GUID。我已经覆盖了Object.equals()以使用此id进行比较,因为我希望它与对象的副本一起使用。现在我也想覆盖Object.hashCode(),这基本上意味着将我的long映射到某个int返回值。如果我正确理解了hashCode的用途,它主要用于哈希表,因此需要均匀分布。这意味着,只需返回id%2^32就足够了。仅此而已,还是我应该注意其他事情? 最佳答案 从Java8开始你可以使用Long.hashCode(guid);对于旧版本的Java
Enum类中的方法hashCode()是final的,定义为super.hashCode(),表示它根据实例地址返回一个数字,是程序员POV的随机数。定义它,例如因为ordinal()^getClass().getName().hashCode()在不同的JVM中是确定性的。它甚至会更好一点,因为最低有效位会“尽可能多地改变”,例如,对于包含多达16个元素和大小为16的HashMap的枚举,肯定不会发生冲突(当然,使用EnumMap更好,但有时不可能,例如没有ConcurrentEnumMap)。按照目前的定义,你没有这样的保证,是吗?答案总结使用Object.hashCode()与上