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

JAVA-集合相关

HashMap如何解决哈希冲突的?

  1. 计算hash值,基于hashCode计算
  2. 冲突之后,先是使用链式寻址法
  3. 当链表长度大于8,且hash表的容量大于60的时候,再添加元素则转化成红黑树

为什么计算hash值是,是将hash地址的值右移16取异或?
核心目的:减少hash冲突的概率。

hashMap什么时候扩容?
大于当前容量的75%时,执行扩容操作
当 HashMap 元素个数达到扩容阈值,默认是 12 的时候,会触发扩容。
默认扩容的大小是原来数组长度的 2 倍,HashMap 的最大容量是 Integer.MAX_VALUE,也就是 2^31-1。在这里插入图片描述

HashMap会什么会产生死循环?

只有1.7存在这个问题,1.8已经解决了。头插法。
在这里插入图片描述
如果线程A和线程B同时触发了扩容操作,此时,A处于扩容中,而B线程已经扩容完成,则A对应的指针操作,此时A对应的节点如下:
死循环达成。
在这里插入图片描述

ConcurrentHashMap的底层实现原理?

线程安全===怎么实现的?syns?lock?

  1. 数据结构:数组+单向链表+红黑树组成
  2. 并发安全:对指定的node节点加锁,来保证数据更新的安全性

ConcurrentHashMap的size方法线程安全吗?
非线程安全方法。
在这里插入图片描述

ConcurrentHashMap 为什么不允许key为null?

线程安全的角度去考虑

ConcurrentHashMap 这么设计的原因是为了避免在多线程并发场景下的歧义问题。
也就是说,当一个线程从 ConcurrentHashMap 获取某个 key,如果返回的结果是 null 的时候。
这个线程无法确认,这个 null 表示的是确实不存在这个 key,还是说存在 key,但是 value 为空。
这种不确定性会造成线程安全性问题,而 ConcurrentHashMap 本身又是一个线程安全的集合。
所以才这么设计。

ArrayList 自动扩容机制?

在这里插入图片描述


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

相关文章:

  • 【Python】爬虫通过验证码
  • 谷歌浏览器的自动翻译功能如何开启
  • 动手学深度学习68 Transformer
  • ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=2)
  • Vue 中的定时刷新与自动更新实现
  • Axure是什么软件?全方位解读助力设计入门
  • 功能测试干了三年,快要废了。。。
  • 工号不够用了怎么办? - 华为OD统一考试(E卷)
  • 【代码随想录训练营第42期 续Day58打卡 - 图论Part8 - Dijkstra算法
  • 在 Linux 系统中目录架构说明
  • c语言--力扣简单题目(最后一个单词的长度)讲解
  • 【毕设】基于Java的超市管理系统
  • SQL:DATEDIFF函数
  • Java网络编程:构建高性能的TCP/IP服务
  • OpenAI草莓正式发布,命名o1
  • SEW变频器的组成
  • 十一,Spring Boot 当中配置拦截器的“两”种方式
  • 函数调用与作用域
  • 下载 llama2-7b-hf 全流程【小白踩坑记录】
  • docker可视化管理工具推荐!docker.ui
  • OpenMV与STM32
  • nodejs 007:错误npm error Error: EPERM: operation not permitted, symlink
  • 9.18 微信小程序开发笔记
  • HTTPS是如何保证安全传输的
  • spring boot设置多环境的配置文件
  • 【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)