自学内容网 自学内容网

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 自动扩容机制?

在这里插入图片描述


原文地址:https://blog.csdn.net/weixin_44804108/article/details/142330915

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!