当前位置: 首页 > news >正文

java中哈希家族底层原理

HashSet如何判断两个对象是否相等?

在Java中,HashSet是使用哈希表实现的,其核心是通过对象的哈希码来快速查找和判断元素是否存在。在判断两个对象是否相等时,HashSet并不直接比较对象的内容,而是通过比较它们的哈希码来快速做出决策。

在Java中,对象相等性的判断有两个条件:

  1. 两个对象引用指向同一个对象(即他们是同一个对象)。
  2. 两个对象引用指向不同的对象,但这两个对象的内容相等。

对于第一个条件,可以通过比较两个引用是否完全相同(即使用“==”操作符)来判断。而对于第二个条件,则需要通过实现equals()方法来定义如何判断两个对象的内容是否相等。

当我们在HashSet中添加或查找元素时,HashSet首先会计算对象的哈希码,然后使用这个哈希码来决定将对象存储在哈希表的哪个位置。然后,如果我们需要查找一个元素,HashSet会计算这个元素的哈希码,并查看该位置的元素是否与我们要查找的元素相等。这个“相等”的判断也是通过equals()方法来实现的。

所以,对于HashSet来说,它并不直接比较对象的每一个属性是否都相同,而是通过比较对象的哈希码来快速判断两个对象是否可能相等。如果两个对象的哈希码不同,那么它们肯定不相等;如果两个对象的哈希码相同,HashSet才会进一步调用equals()方法来最终确定它们是否相等。

请注意,如果你想在HashSet中使用自定义对象,并且这些对象需要根据某些特定属性来判断相等性(例如,你想把表示同一个人的两个不同的实例视为相等的),那么你需要确保你的自定义类正确地覆盖了equals()hashCode()方法。

HashMap的底层实现是什么?

HashMap 是 Java 集合框架中的一种数据结构,它使用哈希表(Hash Table)作为其底层实现。哈希表是一种数据结构,它通过将键(key)映射到桶(bucket)中来存储数据。

在 HashMap 中,每个键值对(key-value pair)都存储在一个节点(Node)中,该节点包含键、值和指向下一个节点的指针。HashMap 使用哈希函数将键映射到桶的索引,这样就可以快速定位到特定的键值对。

HashMap 的底层实现主要包括以下几个方面:

  1. 数组和链表:HashMap 使用一个数组来存储桶,每个桶中包含一个链表,链表中的节点存储了键值对。当发生哈希冲突时,即两个键的哈希值相同,它们会被存储在同一个桶中的链表中。
  2. 哈希函数:HashMap 使用一个哈希函数来将键映射到桶的索引。默认情况下,HashMap 使用对象的 hashCode() 方法来计算哈希值。
  3. 扩容和缩容:当 HashMap 中的元素数量过多或过少时,会进行扩容或缩容操作。扩容是指增加桶的数量,缩容是指减少桶的数量。
  4. 重新哈希:当发生哈希冲突时,HashMap 会使用链表来存储冲突的键值对。当链表过长时,会进行重新哈希操作,即改变哈希函数,使得更多的键能够映射到不同的桶中,从而减少冲突。

总之,HashMap 的底层实现主要包括数组、链表、哈希函数、扩容、缩容和重新哈希等机制。这些机制共同协作,使得 HashMap 能够在常数时间内完成插入、删除和查找操作。

Hashtable和ConcurrentHashMap之间有什么区别?

Hashtable和ConcurrentHashMap是Java中的两种常用的线程安全的Map数据结构,它们之间存在以下主要差异:

  1. 线程安全性:两者都提供了线程安全,但ConcurrentHashMap的线程安全性更强。在Hashtable中,当多个线程同时访问时,需要同步处理,这可能导致性能下降。而ConcurrentHashMap使用了更细粒度的锁,使得在多线程环境下提供了更好的性能和可靠性。
  2. 锁的粒度:在Hashtable中,整个表是加锁的,这可能导致锁竞争激烈,降低并发性能。而ConcurrentHashMap则是将整个哈希表划分为多个小的段(Segment),每个段包含了若干个键值对(Entry)。当多个线程同时访问哈希表时,它们可以同时访问不同的段,从而避免了锁竞争,大大提高了并发度和性能。
  3. 扩容策略:在Hashtable中,一旦触发扩容操作,就需要持有锁的线程完成整个扩容过程。这个过程涉及到大量的元素拷贝,效率较低。而ConcurrentHashMap的扩容操作则是化整为零,扩容时新旧空间同时存在。后续的线程也会执行上述操作,直到将所有元素全部搬运完毕。由于每次只需要拷贝少量元素,效率较高。
  4. 计算hash值方式:在Hashtable中,通过计算key的hashCode()来得到hash值,这个值就是最终的hash值。而在ConcurrentHashMap中,当出现hash冲突时,会通过链表+红黑树的方式解决。此外,ConcurrentHashMap还有一个hash方法重新计算了key的hash值,因为hash冲突变高,所以通过一种方法重算hash值的方法:这里计算hash值,先调用hashCode方法计算出来一个hash值,再将hash与右移16位后相异或,从而得到新的hash值。
  5. 性能:ConcurrentHashMap在很多方面都优于Hashtable。例如,ConcurrentHashMap的size属性通过CAS更新(较快),而Hashtable的size属性通过synchronized操作更新(较慢)。

综上所述,与Hashtable相比,ConcurrentHashMap提供了更高的并发性和更好的性能。在大多数情况下,应该优先选择ConcurrentHashMap作为线程安全的Map实现。

相关文章:

  • 扫码看文件效果怎么做?文件转成二维码能制作吗?
  • 写着玩的程序:pycharm实现无限弹窗程序(非病毒程序,仅整蛊使用)
  • PALWORLD linux centos7开服教程
  • 持续集成工具Jenkins的使用之安装篇(一)
  • vue和react的差异梳理
  • AWS认证SAA-C03每日一题
  • 【UE5】第一次尝试项目转插件(Plugin)的时候,无法编译
  • cad二次开发autolisp(一)
  • canvas绘制旋转的椭圆花
  • angular-tree-component组件中实现特定节点自动展开
  • package.json包版本控制方法介绍
  • 2024年 复习 HTML5+CSS3+移动web 笔记 之CSS遍
  • [pytorch入门] 3. torchvision中的transforms
  • 【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(一):基础知识考察
  • CSS 蜡烛效果
  • canvas 五子棋游戏
  • css的样式优先级
  • Elasticsearch 参考指南(升级前重新索引)
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • javascript 总结(常用工具类的封装)
  • Vue官网教程学习过程中值得记录的一些事情
  • Webpack 4 学习01(基础配置)
  • 大主子表关联的性能优化方法
  • 事件委托的小应用
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​linux启动进程的方式
  • ​虚拟化系列介绍(十)
  • ![CDATA[ ]] 是什么东东
  • #include<初见C语言之指针(5)>
  • (70min)字节暑假实习二面(已挂)
  • (九)信息融合方式简介
  • (七)c52学习之旅-中断
  • (转)Oracle存储过程编写经验和优化措施
  • (转)Windows2003安全设置/维护
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .libPaths()设置包加载目录
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .Net程序帮助文档制作
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET企业级应用架构设计系列之结尾篇
  • .NET企业级应用架构设计系列之应用服务器
  • .net中调用windows performance记录性能信息
  • .so文件(linux系统)
  • /etc/sudoers (root权限管理)
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [20150904]exp slow.txt
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算
  • [CLR via C#]11. 事件
  • [HNOI2008]Cards
  • [kubernetes]控制平面ETCD
  • [leetcode]56. Merge Intervals归并区间
  • [leetcode]Clone Graph