HashMap本身无序无顺序,该程序是如何实现数组排序的?
HashMap输出有序结果的原理说明
首先明确核心结论:这段代码的输出有序并非HashMap本身具备排序特性,完全是特定测试场景下的巧合,换个测试用例/运行环境马上就会失效。
具体原因拆解
- Java官方对
HashMap的明确定义是不保证任何迭代顺序,迭代顺序会随着版本、容量、插入顺序等因素变化,永远不要依赖HashMap的顺序做逻辑处理。 - 这段代码刚好满足两个特殊条件才出现了有序输出:
- Key的类型是
Integer,而Integer的hashCode()返回值就是自身的数值,哈希碰撞概率极低。 - 测试用例的所有Key值都是1~8的小整数,而
HashMap默认初始容量为16,Key在HashMap数组桶的下标计算公式为(hash(key) & (容量 - 1)),算出来的下标刚好等于Key本身的数值。HashMap迭代的时候会从数组的第一个桶往后遍历,自然就按Key升序输出了。
- Key的类型是
- 你可以自行验证这个结论:把测试数组替换为
int a[] = {1,10,20,30}, b[] = {2, 11, 21, 31};,再次运行代码输出就会变成无序状态。
代码存在的问题
代码里注释写的using map as a inbuilt tool to store elements in sorted order是完全错误的,如果你需要稳定有序的Map实现,应该使用TreeMap,它会默认按照Key的自然排序规则存储元素,不管测试用例怎么变都能保证有序输出。
内容的提问来源于stack exchange,提问作者Kartheek L
相关产品推荐
相关产品推荐

