Java软件低级错误: 定义equals方法的同时也要定义hashCode方法
2011-05-31 21:29
381 查看
解读:
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无法找到期望的对象。
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无法找到期望的对象。
相关文章推荐
- Java软件低级错误(十 四):定义equals方法的同时也要定义hashCode方法
- 一种常见的Java编程错误:没有同时定义equals()和hashCode()方法
- 一种常见的Java编程错误:没有同时定义equals()和hashCode()方法
- Java软件低级错误(十 ):正确定义hashcode
- JAVA中重写equals()方法的同时要重写hashcode()方法
- Java基础之重写equals方法的同时为什么要重写hashCode方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- Java中复写equals()方法的同时也要复写hashCode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- java中重写equals()方法的同时要重写hashcode()方法(详解)
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- 覆盖 equals 方法时应同时覆盖 hashCode 。(java)
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中自定义对象比较时重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法