前些天看到一个有意思的说法,当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的顺序来的
标签:有序,数组,16,可以,key,65535,HashMap From: https://www.cnblogs.com/huainanyin/p/18074760