【JAVA】hashcode() & equals()
2016-04-30 10:57
513 查看
平时使用map时都是用JAVA原生的类型,所以很少关注到hashcode()和equals()的方法的内部实现。近期实现一个小工具,涉及到自己写的类的查找比对,又再次重温了相关的知识。
上简单示例代码,比对自己覆写和不覆写的差异
不覆写hashcode()和equals():
View Code
执行结果:
obj1.equals(obj2)=true
map.get(obj2)=test
关于equals()方法不再多余介绍,重点篇幅是关于hashcode()的如何更好实现
《effective java》第9条:覆盖equals时总要覆盖hashcode
规范要求:相等的对象必须有相同的散列码。否则从map中当作key值得到的散列码是不同的,从而取到的value结果是不同的,上述的例子就是一个很好的证明
在不覆写的情况下,hashcode方法是JAVA默认生成的。从代码执行结果看obj1.equals(obj2)为true时,仍然hashcode不同,也就说JAVA默认的是不符合要求的,要求我们必须覆写。
关于hashcode,如果方法写的简单会造成hashcode的不断冲突,这样每个对象被映射到同一个散列桶中,使得散列表退化为链表。使得本应线性时间运行的程序变成了平方级在运行。
所以effecive java同时给了实现的参考
上简单示例代码,比对自己覆写和不覆写的差异
不覆写hashcode()和equals():
import java.util.HashMap; import java.util.Map; public class HashCode_Equals { public int a; public int b; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + a; result = prime * result + b; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; HashCode_Equals other = (HashCode_Equals) obj; if (a != other.a) return false; if (b != other.b) return false; return true; } public static void main(String[] args) { Map<HashCode_Equals, String> map = new HashMap<HashCode_Equals, String>(); HashCode_Equals obj1 = new HashCode_Equals(); obj1.a = 1; obj1.b = 1; map.put(obj1, "test"); HashCode_Equals obj2 = new HashCode_Equals(); obj2.a = 1; obj2.b = 1; System.out.println("obj1.equals(obj2)=" + obj1.equals(obj2)); System.out.println("map.get(obj2)=" + map.get(obj2)); } }
View Code
执行结果:
obj1.equals(obj2)=true
map.get(obj2)=test
关于equals()方法不再多余介绍,重点篇幅是关于hashcode()的如何更好实现
《effective java》第9条:覆盖equals时总要覆盖hashcode
规范要求:相等的对象必须有相同的散列码。否则从map中当作key值得到的散列码是不同的,从而取到的value结果是不同的,上述的例子就是一个很好的证明
在不覆写的情况下,hashcode方法是JAVA默认生成的。从代码执行结果看obj1.equals(obj2)为true时,仍然hashcode不同,也就说JAVA默认的是不符合要求的,要求我们必须覆写。
关于hashcode,如果方法写的简单会造成hashcode的不断冲突,这样每个对象被映射到同一个散列桶中,使得散列表退化为链表。使得本应线性时间运行的程序变成了平方级在运行。
所以effecive java同时给了实现的参考
相关文章推荐
- Eclipse上安装GIT插件EGit及使用
- Eclipse:The resource 'project name'is not accessible for lauching
- myeclipse项目导入到eclipse中缺jar包
- Git/Github的使用以及与Eclipse的整合
- Struts2注解配置之@Results和@Result
- 【原创】堆排序(java实现)
- Code Hunt 题解 00-04 (Java)
- Struts2 S2 – 032远程代码执行漏洞分析报告
- ubuntu 14.04 java开发环境搭建 jdk 以及 inteliJ IDEA安装
- Java 中泛型的协变
- 【Java】使用javaassist修改jar包
- java-----String的intern关键字
- Java 性能笔记:自动装箱/拆箱
- Spring注解详解
- <Java中的继承和组合之间的联系和区别>
- Java基础之理解Annotation(与@有关,即是注释)
- Java中正则表达式的几种用法
- 如何查看JDK以及JAVA框架的源码
- Eclipse启动报错”java was started but returned exit code=13”
- 高吞吐低延迟Java应用的垃圾回收优化