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

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.lryc.cn/news/255836.html

相关文章:

  • 数据可视化:解锁企业经营的智慧之道
  • JVM 性能调优
  • linux常用命令-yum命令详解(超详细)
  • 解决 Element-ui中 表格(Table)使用 v-if 条件切换后,表格的列的筛选不显示了
  • Navicat 技术指引 | 适用于 GaussDB 分布式的自动运行功能
  • 爬虫 selenium语法 (八)
  • NTP时钟同步服务器(校时服务器)技术参数分享
  • JDBC详解——增删改查(CRUD)、sql注入、事务、连接池
  • K-means算法通俗原理及Python与R语言的分别实现
  • 使用 db2diag 工具来分析 db2diag 日志文件
  • 在Pytorch中使用Tensorboard可视化训练过程
  • Redis 命令全解析之 Hash类型
  • postgresql数据库配置主从并配置ssl加密
  • IO多路转接之select
  • linux如何删除大文件的第一行(sed)
  • Navicat 技术指引 | 适用于 GaussDB 分布式的备份/还原功能
  • 【广州华锐互动VRAR】VR戒毒科普宣传系统有效提高戒毒成功率
  • 守护安全,六氟化硫气体泄漏报警装置校准服务
  • 概率测度理论方法(第 2 部分)
  • 实战:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服务协同部署(包含解决浏览器访问Linux部署服务器本地资源问题)
  • Docker 设置国内镜像源
  • 通信协议 远程调用RPC
  • 决策树 算法原理
  • Git全局设置命令---设置提交人邮箱
  • 3DCAT+上汽奥迪:打造新零售汽车配置器实时云渲染解决方案
  • 物联网+AI智慧工地云平台源码(SaaS模式)
  • python打开相机,用鼠标左键框选矩形区域,支持一次框选多个矩形区域,通过鼠标右标清除上一次画的矩形。
  • 卷积之后通道数为什么变了
  • ubuntu18.04安装opencv-4.5.5+opencv_contrib-4.5.5
  • 实验3.5 路由器的单臂路由配置