java 之 hashmap

1.hashset 为什么不能重复?
hashset 底层就是包装了hashMap ,其实就是用到了hashMap的Key不能重复的特征 从而实现了不能重复的功能

1hashMap的初始容量是16

2.hashMap是如何解决hash冲突?
底层是把hash冲突的值使用链表进行连接起来

3.hashMap的key为null的时候放在哪的?
固定的放在数组的第1个位置 (也就是0下标)

4.hashMap 根据hash值计算下标的时候为什么是《h & (length-1)》?
因为用length为偶数,length-1就是奇数 在底层计算的时候h & (length-1)计算出来的数可以防止冲突 从而避免链表过长

**5.hashMap 什么时候

扩容?**
在增加<key,value>的时候,当里面的数组长度大于阈值(size加载因子)并且当前的key存在下标冲突的时候才会扩容 每次2扩容
(扩容的时候回查询计算index值)
6.为什么加载因子是0.75?
如果加载因子过小的话 可能会扩容频繁 浪费资源
如果加载因子过大的话 可能会导致扩容非常的不频繁 从而导致链表过长 查询效率就会降低

7.多线程情况下jdk7hashMap扩容为什么会存在死循环?
因为在扩容的时候数组的长度发生变化 ,会查询根据hash值计算index值需要将原来的table放到新的table中同时也改变了链表的引用循序 这样就有可能导致循环依赖所以就死循环(头插法得到)

HashMap jdk7 和 jdk8有什么区别 ?
jdk7中计算hash值非常的均摊可以减少hash的冲突 因为链表的查询效率低,所以可以这样可以提高查询效率
《o(n)》

jdk8中计算hash非常的简单,hash的冲突 概率比较大,但是没关系,因为底层使用了红黑树 查询效率较高(链表大于8大于并且数组的长度的时候才使用红黑树)(红黑树长度小于6的时候又会转化为链表)
《o(log N)》

jdk7 ConcurrentHashMap
底层采用分段的方式上锁,默认16段,也就是每个Segment都有自己独立的锁,新增一个值的时候,先计算Segment 的下标位置,在计算Segment里面数组下标的位置;

Jdk1.8 ConcurrentHashMap
没有发生冲突底层采用CAS无锁机制去创建数组上的node (New Node) 可以保证线程安全性的问题,如果index产生了冲突 ,使用synchronized上锁,锁的粒度比jdk1.7更加精细;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值