以上程序的执行结果如下:
预期的结果应该是按时间的先后顺序展示的,如下图所示:
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) { HashMap<String, Object> result = getList(); result.forEach((k, v) -> { System.out.println(k + ":" + v); }); } // 查询方法(简化版) public static HashMap<String, Object> getList() { HashMap<String, Object> result = new LinkedHashMap<>(); // 最终返回的结果集 // 伪代码:从数据库中查询出了数据,然后对数据进行处理之后,存到了 for (int i = 1; i <= 5; i++) { result.put("2022-10-" + i, "hello java" + i); } return result; } }