Java软件低级错误: 定义equals方法的同时也要定义hashCode方法

    技术2022-06-10  55

    解读:   equals方法用于实现对象之间逻辑上是否相等的判断,而不是判断两个引用是否指向同一个对象,hashCode用于返回对象的哈希码(也有翻译成散列码的),逻辑上相等(equals比较相等)的两个不同对象它们返回的hashCode值肯定不相等。 Java规范中规定:如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果,所以定义equals的同时一定要定义hashCode,并且要保证equals比较相等的对象,hashCode返回值也必须相同。 ¨ 案例:  Map<MyStruct, String> m =  new  HashMap<MyStruct, String>();  m.put( new  MyStruct(707),  "Jenny" );  System. out .println(m.get( new  MyStruct(707)));   上面的代码,MyStruct定义了equals方法,没有定义hashCode,输出的结果原本希望是Jenny,但结果却是null,上面的类定义违反了上面所说的Java规范,运行时实际上有两个MyStruct对象,但逻辑上是同一个对象。MyStruct使用了默认的hashCode实现,使的逻辑上相同的对象(equals比较相等),它们的hashCode却不同,Map查找对象的时候会首先比较hashCode值,然后再使用equals比较,造成Map无法找到期望的对象。 


    最新回复(0)