HashCode深入理解

    xiaoxiao2021-12-13  21

    带着问题去理解:  

        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值一定相同

    转载请注明原文地址: https://ju.6miu.com/read-950265.html

    最新回复(0)