HashMap也是可以有序的?

前些天看到一个有意思的说法,当HashMap的key为Integer时,map就是有序的,我来研究一下。

我们都知道HashMap是无序的,TreeMap是有序的,数组和链表也是有序的,为啥会变成有序呢?我们先来随便测试一下

 

果然,key是0到100的时候都是有序的,不管使用keySet还是entrySet的形式遍历map,隐隐觉得不可能全都是有序的吧,扩大范围再试一下,果然,当key是在0到65535的时候才是有序的

我们来研究一下原理,为什么是0到65536

众所周知,HashMap是  数组 + 链表/红黑树来实现的,数组的下标是由key的hash及数组长度来确定的,

关键是hash值,是由key本身的hashCode(int值,32位),把这个值的高16位和低16位进行异或得到的(非官方说法,说是扰动函数,这样做能让确定数组下标的时候分布更离散,因为利用到了高16位的信息)

 而Integer的hashCode就是自身的数值,所以就能解释为什么是发生这个情况是在 key小于65535大于等于0的时候,因为这时候hashCode高16位全是0,高16和低16异或出来还是本身。

那是不是只要key是Integer,key的范围是0到65536,这个map就能变成有序了?

当然不是,还要看数组长度,当你是按key顺序一个一个add进去的时候,此时由于数组一直是比hash值大的,所以根本没有哈希碰撞,没有链表和红黑树什么事,此时HashMap退化成了一个数组

 

当然如果是你一开始就给HashMap的size设置为65535,然后往里put的key的范围是在0和65535中间,那输出还是按key的顺序来的

 

posted @ 2024-03-15 09:49  坏男银  阅读(150)  评论(0编辑  收藏  举报