用户工具

站点工具


分享:技术:hash:hashcode

hashcode

概念

hashcode即哈希码,是java的object类中的

public native int hashCode();

一般在散列集合中用到,如: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的关系

对于两个对象:

  1. 如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等
  2. 如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同
  3. 如果两个对象的hashcode值不等,则equals方法得到的结果必定为false
  4. 如果两个对象的hashcode值相等,则equals方法得到的结果未知

比较过程

在如下HashMap操作过程中

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)));

比较两次new出来的People对象时候:

  1. 如果不重写hashcode和equals方法,则肯定输出null
  2. 如果只重写equals,不重写hashcode,则也输出null,因为先比较hashcode结果为不相等,hashcode不等equals肯定不等
  3. 如果按如下方式重写了hashcode和equals,则比较hashcode相等,再比较equals也相等,才能输出1
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;
    }
}

注意,如果hashcode值和equals判断与容易改变的属性有关,则同一对象,在不同时候可能产生的hashcode会不一样,比较结果页会不一样。

参考帖子

分享/技术/hash/hashcode.txt · 最后更改: 2016/02/02 13:02 由 gxx