Java底层技术系列文章-hashcode深入理解

时间:2021-03-22 16:19:58

带着问题去理解:  

    1. Object类HashCode方法是如何实现的,和String类有什么区别?

    2.HashCode和Equals之间的关系?

 

一、hashCode作用   

    hashCode方法返回该对象的哈希码值,主要是用于对象查找的快捷性,要确保同一个对象多次hashcode一定返回同样的hashcode值(其实hashcode值是有缓存)。如在HashTable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的.

 

二、HashCode实现  

     hashcode主要用于对象查找的快捷性,在设计时应尽量避免hashcode值一样造成冲突。所以要计算得到不同对象有hashcode值,应找到每个对象都不一样的特性,寻思着Object对象大概只有内存地址不一样。所以Object类中hashCode方法实现如下:

  public native int hashCode();

    Object类直接是直接调用本地c++方法中的hashCode,原因是java中是没办法拿到对象内存中的地址,所以转交给c++中实现,在底层c++代码中,通过对对象内存地址进行映射,就得到对象的散列值。  

   

    那在String类中,String类是继承Object类,会是同样的方法获得hashcode吗? 

   我们不妨来考虑String类对象的场景,String a = new String(“abc”) 和 String b = new String(“abc”),a对象和b对象的内存地址不一样,但是他们的内容是一样的。显然,如果同样采用内存的方法来获取hashcode值,就会出现相同内容,hashcode值不一样。所以在String类中,重写了hashCode方法     

   

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

             for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
}

  

 

   在String类中,是根据字符串char值相加获取hashcode值,这样使得通过new出来相同内容的对象,能够有相同hashcode值。  

 

三、hashCode与equals关系

    相同的hashcode值,equals不一定相同。这是因为不同的内存地址,有可能equals相同。

    但equals相同,hashcode值一定相同