做民宿要给网站多少合同钱,淄博网站制作企业营销,网站建设方案推销,wordpress python采集作者 | 王磊来源 | Java中文社群#xff08;ID#xff1a;javacn666#xff09;转载请联系授权#xff08;微信ID#xff1a;GG_Stone#xff09;最近公司新来了一个小伙伴#xff0c;问了磊哥一个比较“奇怪”的问题#xff0c;这个问题本身的难度并不大#xff0c;但… 作者 | 王磊来源 | Java中文社群IDjavacn666转载请联系授权微信IDGG_Stone最近公司新来了一个小伙伴问了磊哥一个比较“奇怪”的问题这个问题本身的难度并不大但比较“隐蔽”那究竟是什么问题呢接下来我们一起来看。起因最近公司的系统要增加一个新的列表展示功能功能本身难度并不大但遇到了一个很“可怪”的问题。小伙伴在执行查询列表时明明已经使用了 order by 进行排序了但最终查询出来的数据却还是乱的。预期中的正确结果现实中的非预期结果那到底是哪里出现了问题呢问题展示为了方便展示我把复杂的业务程序简化成了以下代码import 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 HashMapString, Object getList() {HashMapString, Object result new HashMap(); // 最终返回的结果集// 伪代码从数据库中查询出了数据然后对数据进行处理之后存到了for (int i 1; i 5; i) {result.put(2022-10- i, hello java i);}return result;}
}以上程序的执行结果如下预期的结果应该是按时间的先后顺序展示的如下图所示PS以上示例代码中插入元素的顺序是有序的从 1 到 5相当于实际业务场景中的 order by。原因分析既然原数据使用了 order by 排序那么原数据肯定是没问题的那问题就只会出现在返回集 HashMap 上然后我们再把焦点放到 HashMap 上 瞬间醒悟哦原来如此。HashMap 使用的是哈希方式进行存储的因此存入和读取的顺序可能是不一致的这也说 HashMap 是无序的集合所以会导致插入的或 order by 的顺序与最终展示的顺序不一致。解决方案经过上面的分析我们顺利找到了问题那接下来就是制定相应的解决方案了我想到的解决方案有两个稍微麻烦一点但正确的解决方案将返回的不确定数据类型 HashMap 改为确定的数据类型比如 List简单一点但并不是最优的解决方案将无序的 HashMap 改为有序的 LinkedHashMap此方案的优点是只需要改动一个单词就可以解决整个问题了。第一种解决方案大家都懂这里就不演示了接下来咱们使用第二种解决方案将上面的问题改造一下最终的实现代码如下import java.util.HashMap;
import java.util.LinkedHashMap;public class App {public static void main(String[] args) {HashMapString, Object result getList();result.forEach((k, v) - {System.out.println(k v);});}// 查询方法(简化版)public static HashMapString, Object getList() {HashMapString, Object result new LinkedHashMap(); // 最终返回的结果集// 伪代码从数据库中查询出了数据然后对数据进行处理之后存到了for (int i 1; i 5; i) {result.put(2022-10- i, hello java i);}return result;}
}以上程序的执行结果如下从上述结果可以看出当使用 LinkedHashMap 替代了 HashMap 之后返回的顺序就能和插入的顺序保持一致了。LinkedHashMap 的魔力为什么 HashMap 是无序的而 LinkedHashMap 却是有序的呢这要从二者的实现说起了LinkedHashMap 属于 HashMap 的子类所以 LinkedHashMap 除了拥有 HashMap 的所有特性之后还具备自身的一些扩展属性其中就包括 LinkedHashMap 中额外维护了一个双向链表这个双向链表就是用来保存元素的插入顺序的这也是为什么 LinkedHashMap 可以实现访问顺序和插入顺序一致的原因了。总结本文演示了 HashMap 作为返回类型时隐藏的一个小“坑”因为 HashMap 本身是无序的所以它会导致查询顺序和插入顺序不一致的问题对应的解决方案有两种使用确定的数据类型来替代 HashMap比如 List或者使用有序的 LinkedHashMap 来替代无序的 HashMap。关注公众号「Java中文社群」查看更多 Java 总结性系列文章。往期推荐Java 中 List 分片的 5 种方法阿里二面为什么要分库分表50行代码搞定敏感数据读写