HashMap为什么是无序的?无序怎么办?TreeMap和LinkedHashMap---Java工作笔记021

HashMap的无序性在某些场景下可能导致问题,例如接口数据顺序要求。本文探讨了HashMap的哈希冲突解决机制及无序原因,并介绍了LinkedHashMap(按插入或访问顺序排序)和TreeMap(按Key排序)作为解决方案,以适应不同排序需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   在做项目的时候发现了HashMap的无序性带来的麻烦,由于,从接口获取的数据,是有顺序的,但是添加到HashMap中再输出出来就变的没有顺序了,然后这个结果,如果再输入到其他需要这个接口的数据中去,这样,就因为顺序的原因会导致,接口接收的参数报错了.这个时候就需要考虑用LinkedHashMap 或者 TreeMap代替HashMap了..

Map的底层实现就是哈希表,哈希表的结构主要是Hashcode + 数组

1.存储kv时,首先将k通过hashcode后对数组长度取余,决定需要放入的数组的index

2.当数组对应的index已有元素时,此时产生一个【哈希冲突】。一般来说哈希冲突的解决方式为链表法,即在冲突的位置生成一个链表来存储元素

这可以看到这里,通过将key,通过hashcode后对数组长度取余,这里就会导致map存的key,是无序的了

然后再简单说一下:

Redis中的Dict结构(用于实现RedisDB、Hashmap,Set等)其实就是非常典型的哈希表。Golang中的Map结构与传统的哈希表稍有不同,它数组的基本单元并不是kv对,而是bucket。

每个bucket中可以放置8个kv对,这样可以减少对象的数量,有利于提升GC的性能;当bucket中放置不下时,会继续在溢出桶(overflow)中继续存储,串成一个链表的结构,如图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

添柴程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值