首页 > 其他分享 >HashMap 中处理哈希冲突,红黑树对于没有实现 Comparable 接口的 Key 处理

HashMap 中处理哈希冲突,红黑树对于没有实现 Comparable 接口的 Key 处理

时间:2024-08-10 19:07:03浏览次数:13  
标签:Comparable HashMap 对象 Key tieBreakOrder 哈希 内存地址 类名

背景:假设有两个对象,分别是 stu 和 teach(都没有实现 Comparable 接口),将它们添加进去 HashMap 里,假设这两个对象发生哈希冲突,那么红黑树怎么判断它们谁在左谁在右?依据是什么?

​ 当两个对象 stuteach 的哈希值相同,且它们没有实现 Comparable 接口时,Java 8 的 HashMap 会使用 tieBreakOrder 方法来决定它们在红黑树中的位置。

		/**
         * Tie-breaking utility for ordering insertions when equal
         * hashCodes and non-comparable. We don't require a total
         * order, just a consistent insertion rule to maintain
         * equivalence across rebalancings. Tie-breaking further than
         * necessary simplifies testing a bit.
         */
        static int tieBreakOrder(Object a, Object b) {
            int d;
            if (a == null || b == null ||
                (d = a.getClass().getName().
                 compareTo(b.getClass().getName())) == 0)
                d = (System.identityHashCode(a) <= System.identityHashCode(b) ?
                     -1 : 1);
            return d;
        }

tieBreakOrder 方法首先比较两个对象的类名,如果类名相同,则使用 System.identityHashCode 方法来比较它们的内存地址。

具体来说,tieBreakOrder 方法会执行以下步骤:

  1. 比较类名: 如果两个对象的类名不同,则根据类名的字典序来决定谁在左谁在右。
  2. 比较内存地址: 如果两个对象的类名相同,则使用 System.identityHashCode 方法来比较它们的内存地址。内存地址较小的对象会被放在左边,内存地址较大的对象会被放在右边。

​ 因此,stuteach 在红黑树中的位置取决于它们的类名和内存地址。如果它们的类名相同,则内存地址较小的对象会被放在左边,内存地址较大的对象会被放在右边。

​ 需要注意的是,tieBreakOrder 方法只是 HashMap 在处理哈希冲突时的一种策略。如果两个对象的哈希值相同,但它们的类名和内存地址也相同,那么它们会被视为同一个对象,并且只会存储一次。

标签:Comparable,HashMap,对象,Key,tieBreakOrder,哈希,内存地址,类名
From: https://www.cnblogs.com/lyraUU/p/18352659

相关文章

  • ConcurrentHashMap的原理
    背景我们知道hashmap是一个线程不安全的数据结构,在多线程编程的时候,多个线程同时向hashmap中put元素的时候,会发生数据丢失。多线程put操作后,再get操作导致死循环。多线程put非NULL元素后,get操作得到NULL值。使用为了保证并发安全,我们使用hashmap的时候,建议是使用ConcurrentHas......
  • SQL Server给表添加及删除主键Primary Key及默认值Default约束
    1.添加表的主键(PrimaryKey)和默认值(Default)约束在SQLServer中,给表添加主键(PrimaryKey)及默认值(Default)约束是数据库设计和维护中常见的操作。这些操作可以通过ALTERTABLE语句在表已存在的情况下执行,也可以通过CREATETABLE语句在创建表时直接指定。下面分别介绍这两种情......
  • OneKeyAdmin 后台任意文件下载
    侵权声明本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系:[[email protected]]。我们将在确......
  • react渲染列表中的key的作用
    这个key首先是只在渲染数组列表的时候会用到。比如经常遇到的 如上没有key的话,会报一个错,那么,我们可不可以使用数组的index作为下标呢?答案是不推荐。因为在数组项的顺序在插入、删除或者重新排序等操作中会发生改变,此时把索引作为key可能会产生一些微妙的bug。像下面这种......
  • openssl验证证书文件pem和key是否匹配
    环境:linux环境下1、从key、pem提取公钥opensslx509-inyour_certificate.pem-noout-pubkey>public_key.txtopensslrsa-inyour_private_key.key-pubout>private_key_pub.txt2、验证diffpublic_key.txtprivate_key_pub.txtdiff命令比较这两个公钥文件。......
  • keycloak~关于社区登录的过程说明
    keycloak将第三方登录(社区登录)进行了封装,大体主要会经历以下三个过程:打开社区认证页面,输入账号密码或者扫码,完成社区上的认证由社区进行302重定向,回到keycloak页面keycloak与社区完成一次oauth2授权码认证,通过社区返回的code来获取token,再通过token来获取社区上的用户信息,在这......
  • key命令操作
    key命令操作查询###查看所有keykeys*###匹配查看*keyssit*###单个字符匹配?keyssit?###可选匹配[]keyssit[e|y]判断KEY类型###随机返回一个KEYrandomkey###判断key是否存在(0|1)existssite#1表示存在0表示不存在###返回KEY的类型typesite......
  • ssh 远程登录报错:Unable to negotiate with IP port 22: no matching host key type f
    最近在Mac上想要远程一台Linux服务器,结果不知怎么的就不能使用以前的ssh登录了iot@ios-iMac~%[email protected]:nomatchinghostkeytypefound.Theiroffer:ssh-rsa,ssh-dss ......
  • 如何解决hashmap不按序问题
    HashMap 在Java中本质上是不保证任何顺序的,特别是它不保证元素会按照插入的顺序进行存储或遍历。如果需要维护元素的插入顺序,可以使用 LinkedHashMap,它在内部通过维护一个双向链表来保持插入顺序。如果想要按照键的自然顺序或者自定义的比较器顺序来存储和遍历键值对,可以使......
  • ; 每隔10分钟定时关闭并重启蘑菇游戏下载器,防止下载器卡死宕机死机停止下载的AutoHot
     ;每隔10分钟定时关闭并重启蘑菇游戏下载器,防止下载器卡死宕机死机停止下载的AutoHotkey脚本2024年8月7日  ;每隔10分钟定时关闭并重启蘑菇游戏下载器,防止下载器卡死宕机死机停止下载的AutoHotkey脚本2024年8月7日;测试环境:AutoHotkey_1.1.37.02_Setup.exe&Win......