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

java面试题-Hashmap、Hashtable、ConcurrentHashMap原理

远离八股文,面试大白话,通俗且易懂

看完后试着用自己的话复述出来。有问题请指出,有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来,大家一起解决。

java面试题汇总-目录-持续更新中

Hashmap和hashtable存储逻辑基本相同-都是基于hash表实现的。

原理就是都在内部维护了一个数组,这个数组的每个元素就是一个Bucket(桶)。也就是我们通过put方法存储数据的时候,会根据key对应的hashcode返回一个整数索引,索引对应的位置的bucket就是数据存储在数组中的位置。

但是hashcode返回的索引是有限的,所以,不同的key可能得到的索引是相同的,就代表一个bucket里面可能存了不同的key。这就引入了链表。也就是这个数组里面的每个bucket都是一个链表。(数组里面存链表,链表里面存数据)

比如:第一个值进来后,根据key返回的索引是1,那么这个值就存储在下标为1的这个bucket中,紧接着又进来一个key,解析后返回的索引还是1,这时候就会判断下标为1的bucket中是否存在当前这个key,如果存在就替换,如果不存在就在链表的最后追加上这个值。  

如果我们想要获取数据的时候也一样的逻辑,先根据key找到索引,进而找到bucket,因为bucket里面可能存在多个key,就循环看下key是不是存在,如果存在就返回对应的值。

hashmap内部方法没有加锁,所以是线程不安全的,只适用于单线程的环境,但是性能较快。正常情况下都是可以使用

hashtable内部方法都加有synchronized  所以线程安全,但是性能也比较低下。

更推荐使用ConcurrentHashMap来代替hashtable。

因为ConcurrentHashMap引入了分段锁的概念。

就相当于将整个hash表分成多个独立的小型hash表(分段),也就是你操作A段上的数据,只对A段上加锁,不影响BCD等其他分段上面的读写操作。更适用于高并发的场景。

可以对比下hashtable,他如果写数据的时候,会将整个hash表全都加锁,那么其他线程只能等待他写完后才能再进行读写。而ConcurrentHashMap 就很大程度上避免了这种情况。


http://www.kler.cn/a/159856.html

相关文章:

  • 天才的懈怠 : 平衡二叉树
  • 如何为电子课程创造创意
  • Unity3D学习FPS游戏(11)敌人AI巡逻(NavMesh)
  • 「数据要素」行业简报|2024.11.上刊
  • SpringSecurity源码中核心类
  • 生成 Django 中文文档 PDF 版
  • 微信小程序基础bug
  • 学生档案管理系统设计
  • AI界的“复仇者联盟”:Meta和IBM领衔50+机构对决OpenAI
  • 如何关闭vue项目中的[eslint]校验
  • 纠正性反馈回路
  • 上门安装维修平台开发之产品模型属性设计解析
  • 学习UnitTest框架,轻松打造无懈可击的代码!
  • 外包干了2个月,技术倒退2年。。。
  • MySQL四 | 约束
  • C语言面试之旅:掌握基础,探索深度(面试实战之ARM架构二)
  • ZPLPrinter Emulator SDK for .NET 6.0.23.1123​ Crack
  • 数据科学:Scipy、Scikit-Learn笔记
  • 汽车内饰灯不亮问题修复
  • Redis滚动分页的使用
  • MySQL Binlog Digger 4.31
  • ubuntu上创建服务启动python脚本
  • visual Studio MFC 平台实现拉普拉斯和拉普拉斯与直方图均衡化与中值滤波相结合实现比较
  • Codeforces Round 913 (Div. 3) A~E
  • 通过docker安装人大金仓数据库并挂在数据卷
  • LeetCode860. Lemonade Change