用户工具

站点工具


分享:技术:hash:hashcode

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
分享:技术: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
分享/技术/hash/hashcode.1454384475.txt.gz · 最后更改: 2016/02/02 11:41 由 gxx