javahashset和hashmap的区别,java hashset hashmap
00-1010序题展示LinkedHashMap的神奇总结,原因分析解决方案
00-1010最近公司的系统要增加新的列表显示功能。功能本身不难,但是遇到了一个很“奇怪”的问题。小伙伴在执行查询列表的时候,明明已经使用了order by进行排序,但是最后查出来的数据还是比较乱。
预期中的(正确)结果:
现实中的(非预期)结果:
到底是什么问题?
目录
为了方便展示,我把复杂的业务程序简化成了以下代码:
导入Java . util . hashmap;public class App { public static void main(String[]args){ HashMapString,Object result=getList();result.forEach((k,v)-{ system . out . println(k): v);});}//查询方法(简化版)public static hashmap string,objectgetlist () {hashmap string,object result=new hashmap();//最终返回的结果集//伪代码:从数据库中查询数据,然后处理并存储在for(int I=1;I=5;i ) { result.put(2022-10- i,你好Java I);}返回结果;} }以上程序的执行结果如下:
预期的结果应该是按时间的先后顺序展示的,如下图所示:
PS:在上面的示例代码中,插入元素的顺序是有序的(从1到5),相当于实际业务场景中的order by。
00-1010由于原始数据是按顺序排序的,所以原始数据肯定没问题,问题只会出现在返回集HashMap上。然后我们就专注于HashMap,瞬间清醒。哦,就这样。HashMap是通过哈希来存储的,所以存储和读取的顺序可能不一致。这也意味着HashMap是一个无序的集合,所以会导致插入的顺序(或者order by)与最终显示的顺序不一致。
00-1010经过以上分析,我们成功的发现了问题。那么接下来就是制定相应的解决方案了。我想到两个解决方案:
将稍微麻烦一点但正确的解决方案:返回的不确定数据类型HashMap改为确定的数据类型,比如List;把简单一点但并不是最优的解决方案:s无序HashMap改成有序LinkedHashMap的好处是只需要改一个字就能解决整个问题。第一种方案大家都懂,这里不做演示。接下来,我们用第二种方案来转化上述问题。
最终的实现代码如下:
导入Java . util . hashmap;导入Java . util . linked hashmap;public class App { public static void main(String[]args){ HashMapString,Object result=getList();result.forEach((k,v)-{ system . out . println(k): v);});}//查询方法(简化版)public static hashmap string,objectgetlist () {hashmap string,object result=new linked hashmap();//最终返回的结果集//伪代码:从数据库中查询数据,然后处理并存储在for(int I=1;I=5;i ) { result.put(2022-10- i,你好Java I);}返回结果;} }以上程序的执行结果如下:
从上面的结果可以看出,用LinkedHashMap代替HashMap后,返回的顺序可以和插入的顺序保持一致。
00-1010为什么HashMap是无序的而LinkedHashMap是有序的?
这要从两者的实现说起。LinkedHashMap属于HashMap的一个子类,所以LinkedHashMap除了HashMap的所有特性之外,还有一些自己的扩展属性,包括LinkedHashMap 中额外维护了一个双向链表,这个双向链表就是用来保存元素的(插入)顺序的,这就是为什么LinkedHashMap可以实现相同的访问顺序和插入顺序。
00-1010本文演示了HashMap用作返回类型时隐藏的一个小“坑”。因为HashMap本身是无序的,所以会导致查询顺序和插入顺序不一致的问题。对应的解决方案有两种:用某些数据类型代替HashMap,比如List,或者用有序的LinkedHashMap代替无序的HashMap。
关于Java HashMap中的一个坑的这篇文章到此为止。关于Java HashMap的更多信息,请搜索以前关于流行IT的文章或者继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。