浅谈java hashCode

 哈希表这个数据结构想必大多数人都不陌生,并且在不少地方都会利用到hash表来提升查找效率。在Java的Object类中有一个方法:java

public native int hashCode();

根据这个方法的声明可知,该方法返回一个int类型的数值,而且是本地方法,所以在Object类中并无给出具体的实现。数据结构

1、hashCode做用ide

对于包含容器类型的程序设计语言来讲,基本上都会涉及到hashCode。在Java中也同样,hashCode方法的主要做用是为了配合基于散列的集合一块儿正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。this

  为何这么说呢?考虑一种状况,当向集合中插入对象时,如何判别在集合中是否已经存在该对象了?(注意:集合中不容许重复的元素存在)spa

  也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。可是若是集合中已经存在一万条数据或者更多的数据,若是采用equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的做用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,获得对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,若是table中没有该hashcode值,它就能够直接存进去,不用再进行任何比较了;若是存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,因此这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大下降了,说通俗一点:Java中的hashCode方法就是根据必定的规则将与对象相关的信息(好比对象的存储地址,对象的字段等)映射成一个数值,这个数值称做为散列值。设计

2、hashCode和equals
code

对象未重写equals和hashCode方法orm

  1. hashCode相等 equals未必相等对象

  2. equals相等hashCode必然相等get

若是重写equals方法最好同时重写hashCode方法保证在逻辑上二者相等,否则在散列集合中保存相同可能存在问题

重写hashCode和equals

 @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return name.hashCode()*37+age;
    }
     
    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
         if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (this.getClass() != obj.getClass()) {
            return false;
        }
         
        People p = (People)obj;
        return this.name.equals(((People)obj).name) && this.age== ((People)obj).age;
    }