最近,该公司有一个新的合作伙伴,并向莱兄弟一个更“奇怪”的问题。问题本身并不困难,但更“隐藏”。那是什么问题?让我们一起看看。
最近,该公司的系统必须添加一个新的列表显示功能。该功能本身并不困难,但是它遇到了一个非常“怪异”的问题。当小型合作伙伴执行查询列表时,他显然将订单用于排序,但是最终发现的数据仍然很混乱。
预期(正确)结果:
现实(非预期)结果:
在哪里有问题?
为了促进显示屏,我将复杂的业务过程简化为以下代码:
上述程序的执行结果如下:
预期结果应以时间顺序显示,如下图所示:
PS:在上面的示例代码中,插入元素的顺序是有序的(从1到5),这等同于实际业务场景中的顺序。
现在,原始数据通过排序使用顺序,原始数据绝对没有问题,那么问题只会出现在返回集hashmap上。然后,我们将重点放在哈希图上,并立即醒来,哦,事实证明。Hashmap使用哈希方法存储,因此存款和阅读顺序可能不一致。该顺序是不一致的。
在上述分析之后,我们成功找到了问题,然后下一步是制定相应的解决方案。我想到有两种解决方案:我想到了两个:
每个人都知道,第一个解决方案不会在这里演示。接下来,让我们使用第二个解决方案来改变上述问题。最终实施代码如下:
上述程序的执行结果如下:
从上面的结果可以看出,在使用LinkedHashMap而不是哈希姆普之后,返回顺序可以与插入顺序一致。
为什么Hashmap无序,但LinkedHashmap有序?
从两者的实现中,linkedhashmap属于哈希姆普的子类,因此除了哈希姆普的所有特征外,linkedhashmap还具有其一些自身的扩展属性用于保留(插入)顺序的用于保存(插入)订单,这就是为什么LinkedHashmap可以达到相同的访问顺序和插入顺序的原因。
本文在返回类型时隐藏了hashmap时隐藏了一个小的“坑”。因为哈希图本身是无序的,所以会导致查询顺序和插入顺序不一致。有两种相应的解决方案:使用确定的数据Typeto替换列表,例如列表,或使用有序的LinkedHashMap替换无序的哈希图。
公共帐户:Java中国社区