这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
分享:技术:hash:hashcode [2016/02/02 11:41] gxx 创建 |
分享:技术:hash:hashcode [2016/02/02 13:02] (当前版本) gxx |
||
---|---|---|---|
行 6: | 行 6: | ||
</code> | </code> | ||
一般在散列集合中用到,如:HashSet、HashMap以及HashTable | 一般在散列集合中用到,如:HashSet、HashMap以及HashTable | ||
+ | ===== 作用 ===== | ||
+ | **提高查询效率**:equals比较俩对象是否相等,但是如果数据量很大,效率会很差,所以先比较hashcode,如果hashcode不相等,equals肯定不相等;如果hashcode相等,再比较equals,这样大大减少比较equals的次数,提高查询效率!所以hashcode最大的作用就是用于【**判断不相等**】。 | ||
+ | ===== hashcode与equals ===== | ||
+ | 默认object可以理解为hashcode是返回对象的地址,equals是比较俩对象的地址是否相等**return (this == obj);** | ||
+ | 但是基础类型String,Double,Integer等,重写了hashcode和equals方法,进行的是内容的比较,如果内容一样,不管是不是同一个new出来的对象,返回的hashcode值是一样的和equals比较也是相等的! | ||
+ | ===== hashcode与equals的关系 ===== | ||
+ | 对于两个对象: | ||
+ | - 如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等 | ||
+ | - 如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同 | ||
+ | - 如果两个对象的hashcode值不等,则equals方法得到的结果必定为false | ||
+ | - 如果两个对象的hashcode值相等,则equals方法得到的结果未知 | ||
+ | ===== 比较过程 ===== | ||
+ | 在如下HashMap操作过程中 | ||
+ | <code> | ||
+ | People p1 = new People("Jack", 12); | ||
+ | System.out.println(p1.hashCode()); | ||
+ | HashMap<People, Integer> hashMap = new HashMap<People, Integer>(); | ||
+ | hashMap.put(p1, 1); | ||
+ | System.out.println(hashMap.get(new People("Jack", 12))); | ||
+ | </code> | ||
+ | 比较两次new出来的People对象时候: | ||
+ | - 如果不重写hashcode和equals方法,则肯定输出null | ||
+ | - 如果只重写equals,不重写hashcode,则也输出null,因为先比较hashcode结果为不相等,hashcode不等equals肯定不等 | ||
+ | - 如果按如下方式重写了hashcode和equals,则比较hashcode相等,再比较equals也相等,才能输出1 | ||
+ | <code> | ||
+ | import java.util.HashMap; | ||
+ | import java.util.HashSet; | ||
+ | import java.util.Set; | ||
+ | |||
+ | class People{ | ||
+ | private String name; | ||
+ | private int age; | ||
+ | |||
+ | public People(String name,int age) { | ||
+ | this.name = name; | ||
+ | this.age = age; | ||
+ | } | ||
+ | |||
+ | public void setAge(int age){ | ||
+ | this.age = age; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int hashCode() { | ||
+ | return name.hashCode()*37+age; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public boolean equals(Object obj) { | ||
+ | return this.name.equals(((People)obj).name) && this.age== ((People)obj).age; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | 注意,如果hashcode值和equals判断与容易改变的属性有关,则同一对象,在不同时候可能产生的hashcode会不一样,比较结果页会不一样。 | ||
===== 参考帖子 ===== | ===== 参考帖子 ===== | ||
http://www.cnblogs.com/dolphin0520/p/3681042.html | http://www.cnblogs.com/dolphin0520/p/3681042.html |