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


    带着问题去理解:  

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

  • 相关阅读:
    Python3学习笔记(十二):闭包
    Python3学习笔记(十一):函数参数详解
    PostgreSQL psql中如何查看快捷功能的对应函数
    PostgreSQL逻辑复制槽 pg_recvlogical test_decoding wal2json
    记一次内存占用过高的分析
    数据库一致性解读
    PostgreSQL常用插件收集
    PostgreSQL truncate table会释放索引的空间
    PostgreSQL锁级别及什么操作获取什么锁
    PostgreSQL设置事务隔离级别实验
  • 原文地址:https://www.cnblogs.com/wanwusheng/p/6117806.html
Copyright © 2020-2023  润新知