equals和hashCode没有必然的联系
2015-09-09 09:15
344 查看
由于equals()和hashCode()方法都是Object中的,所以hashCode和equals方法都可以被重写的,如果重写了其中的一个,而没有重写另外一个,则两个对象A,B之间如果A.equals(B)==true ,那么A的hashCode和B的hashCode未必相等。
如果重写了hashCode和equals方法,那么两者就都相等了
所以,在重写了equals方法时,建议最好将hashCode方法也重写了。
package com.jjyy.basic; public class EqualsDemo { public static void main(String[] args) { EqualsTest cat = new EqualsTest("zhansan", 20); EqualsTest dog = new EqualsTest("zhansan", 23); System.out.println(cat.equals(dog)); System.out.println(cat.hashCode() == dog.hashCode()); } } class EqualsTest { private String name; private int age; public EqualsTest(String name, int age) { super(); this.name = name; this.age = age; } @Override public boolean equals(Object obj) { // 只要name相同也可能相同 if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; EqualsTest other = (EqualsTest) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }结果为:
true false
如果重写了hashCode和equals方法,那么两者就都相等了
package com.jjyy.basic; public class EqualsDemo { public static void main(String[] args) { EqualsTest cat = new EqualsTest("zhansan", 20); EqualsTest dog = new EqualsTest("zhansan", 23); System.out.println(cat.equals(dog)); System.out.println(cat.hashCode() == dog.hashCode()); } } class EqualsTest { private String name; private int age; public EqualsTest(String name, int age) { super(); this.name = name; this.age = age; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { // 只要name相同也可能相同 if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; EqualsTest other = (EqualsTest) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }结果为:
true true
所以,在重写了equals方法时,建议最好将hashCode方法也重写了。
相关文章推荐
- #BeginLibraryItem 的疑问...
- Web第三周-Web前端利用Js实现简单计算器功能
- virtualbox中新版本Ubuntu安装软件增强包后重启无限登录界面的解决办法
- Servlet完全教程
- CSS选择器的浏览器支持
- opengl 学习笔记(3) 2D 点、线、坐标、键盘
- oracle用户密码过期的处理方法
- 第一次只出现一次的字符
- Spring学习笔记(九):Spring拦截器和java过滤器的区别
- 【JavaScript】操作Canvas画图
- 读书笔记之TCP/IP1(2)
- C++中int与char*、int与Byte、double与char*的相互装换
- 美丽的三沙
- USACO 1.1 Friday the Thirteenth
- Netsh命令详解
- Eclipse使用小技巧——备忘
- Spring学习笔记(八):数据库连接池的小例子
- What is classical music
- js解决onkeydown长按按键卡顿一下
- LeetCode First Bad Version