您的位置:首页 > 编程语言 > Java开发

【JAVA】hashcode() & equals()

2016-04-30 10:57 513 查看
平时使用map时都是用JAVA原生的类型,所以很少关注到hashcode()和equals()的方法的内部实现。近期实现一个小工具,涉及到自己写的类的查找比对,又再次重温了相关的知识。

上简单示例代码,比对自己覆写和不覆写的差异

不覆写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同时给了实现的参考

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: