[JAVA]Java中hashCode和equals方法的使用
2015-11-19 11:24
579 查看
hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。
首先看MyClass这个类,如下。
这个时候写个测试。如下。
结果分别是false和2。
现在覆写equals方法。
equals方法的正确覆写应该满足 三个性质,反身性,对称性,传递性。这里就不再解释了,数学功底好的同学应该很容易理解这个。
在MyClass类中,加入如下方法。
此时继续运行上面的测试,显示结果为:true,2。
为什么是2呢?这2个明明的相等的。原来,是没有覆写hashCode的原因。关于HashSet这里就不再描述了。
覆写hashCode(通过Eclipse IDE 生成的)后,显示 true,1。
所有覆写equals方法的时候都应该覆写hashCode方法,否则所有该类基于散列的集合的操作都无法正常完成(上面我们测试了HashSet,HashMap,HashTable也是一样的)
但是注意,此时若通过“==”比较,还是false的。因为“==”方法比较的是对象的地址。所以才是false。
首先看MyClass这个类,如下。
public class MyClass { private int id; private String name; public MyClass(int id, String name) { super(); this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
这个时候写个测试。如下。
package testEquals; import java.util.HashSet; import java.util.Set; public class Main{ public static void main(String[] args) { MyClass mc1 = new MyClass(1, "ma"); MyClass mc2 = new MyClass(1, "ma"); Set<MyClass> set=new HashSet<MyClass>(); System.out.println(mc1.equals(mc2)); set.add(mc1); set.add(mc2); System.out.println(set.size()); } }
结果分别是false和2。
现在覆写equals方法。
equals方法的正确覆写应该满足 三个性质,反身性,对称性,传递性。这里就不再解释了,数学功底好的同学应该很容易理解这个。
在MyClass类中,加入如下方法。
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MyClass other = (MyClass) obj; return other.getId()==getId() && other.getName().equals(getName()); }
此时继续运行上面的测试,显示结果为:true,2。
为什么是2呢?这2个明明的相等的。原来,是没有覆写hashCode的原因。关于HashSet这里就不再描述了。
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; }
覆写hashCode(通过Eclipse IDE 生成的)后,显示 true,1。
所有覆写equals方法的时候都应该覆写hashCode方法,否则所有该类基于散列的集合的操作都无法正常完成(上面我们测试了HashSet,HashMap,HashTable也是一样的)
但是注意,此时若通过“==”比较,还是false的。因为“==”方法比较的是对象的地址。所以才是false。
相关文章推荐
- Java之内存分析和String对象
- eclipse项目 转制 studio
- MyEclipse10.6导出war包出错
- 搭建maven+spring+freemaker+mybatis环境之五+testng
- Struts2之值栈(value stack)
- SSH:Struts1框架(创建HelloWorld应用)
- java代码片段
- Spring_Security_3.0.1中文参考文档 PARTIII.web应用安全
- java#学习笔记#遍历添加数组元素
- java多线程实例
- springMVC两种方式实现多文件上传及效率比较
- uploadify 3.2.1+spring mvc上传文件
- mac下eclipse的svn(即svn插件)怎么切换账号?
- Spring定时器--时间设置规则
- java牛人博客
- java String类
- Java 小例子:按照顺时针或逆时针方向输出一个数字矩阵
- java clone
- 解决MyEclipse中的Building workspace问题的三个方法
- JDK、JRE、JVM三者间的关系