HashMap

本文探讨了哈希表的容量、加载因子和阈值概念,以及在Java 1.7和1.8中不同的哈希冲突解决策略。1.7版本先扩容再添加元素,可能导致并发问题;而1.8版本则先添加元素,当链表长度超过8时转换为红黑树。此外,针对并发插入可能导致的数据覆盖,推荐使用ConcurrentHashMap。对于保持插入和查询顺序一致性,可以使用LinkedHashMap。
摘要由CSDN通过智能技术生成

1、

容量:数组大小,也叫哈希表大小(默认1>>4=16)

加载因子:元素装多满(默认0.75)

阈值:容量*加载因子

扩容条件:元素个数>阈值,且新元素key发生hash冲突。

2、

发生hash冲突,即两个元素计算后的hash值相等:

1.7:hash = key.hashcode(),hash9次扰动处理,再&(length-1)

1.8:hash = key.hashcode(),hash2次扰动处理,再&(length-1)

1.7 先扩容,再添加新元素(扩容时,不计算新元素,扩容后,再计算)

扩容后位置:hash = key.hashcode(),hash9次扰动处理,再&(length-1)计算复杂!!!

1.8 先添加,再扩容(扩容时,计算新元素)

3、

1.7:新元素使用头插法,并发扩容导致死循环。

解决:使用ConcurrentHashMap替代,hashtable性能低

1.8:新元素使用尾插法,插入后,判断链表长度>8,则变为红黑树,同时判断是否需要扩容。

4、

并发插入数据,出现数据覆盖。

解决:使用ConcurrentHashMap替代,hashtable性能低

5、

插入顺序与查询顺序不一致。

解决:使用linkedHashMap替代

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值