HashMap 中的一个“坑”!(2)

简介: HashMap 中的一个“坑”!(2)

以上程序的执行结果如下:


微信图片_20220120233644.jpg


预期的结果应该是按时间的先后顺序展示的,如下图所示:


微信图片_20220120233657.jpg


PS:以上示例代码中,插入元素的顺序是有序的(从 1 到 5),相当于实际业务场景中的 order by。

原因分析


既然原数据使用了 order by 排序,那么原数据肯定是没问题的,那问题就只会出现在返回集 HashMap 上,然后我们再把焦点放到 HashMap 上, 瞬间醒悟,哦,原来如此。


HashMap 使用的是哈希方式进行存储的,因此存入和读取的顺序可能是不一致的,这也说 HashMap 是无序的集合,所以会导致插入的(或 order by 的)顺序,与最终展示的顺序不一致。


解决方案


经过上面的分析我们顺利找到了问题,那接下来就是制定相应的解决方案了,我想到的解决方案有两个:


  1. 稍微麻烦一点但正确的解决方案:将返回的不确定数据类型 HashMap 改为确定的数据类型,比如 List;


  1. 简单一点但并不是最优的解决方案:将无序的 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;
    }
}
相关文章
|
3月前
|
存储 安全 Java
HashMap的详细解读
HashMap的详细解读
31 0
|
2月前
|
Dart 算法 Java
HashMap的0.75可能只是一个经验值
HashMap的0.75可能只是一个经验值
|
4月前
|
存储 安全 Java
HashMap
HashMap
40 0
|
存储 缓存 Java
|
存储 安全 Oracle
HashMap你真的了解吗?
HashMap你真的了解吗?
90 0
HashMap你真的了解吗?
|
安全 算法 数据挖掘
厉害了!把 HashMap 剖析的只剩渣了!
很高兴遇见你~ HashMap是一个非常重要的集合,日常使用也非常的频繁,同时也是面试重点。本文并不打算讲解基础的使用api,而是深入HashM
厉害了!把 HashMap 剖析的只剩渣了!
|
存储 机器学习/深度学习 算法
HashMap详解
HashMap详解
2700 0
HashMap详解
|
机器学习/深度学习
HashMap 详解二
tableSizeFor 方法 初始化 HashMap 的长度大小, 会调用 tableSizeFor 方法赋值给 threshold // 构造函数 public HashMap(int initialCapacity, float loadFactor) { if (initialC.
986 0
|
索引
HashMap 详解三
resize 方法 数组为空或者元素数量超过阈值, 将会执行 resize() 方法, 结果是将数组的长度加倍. final Node<K,V>[] resize() { // 设置旧数组, 旧长度, 旧阈值 Node<K,V>[] oldTab = table; int oldCap = (oldTab == null) ? 0 : oldTab.
978 0
HashMap 详解五
红黑树性质 红黑树是平衡二叉树的一种, 但是它的平衡因子是可以大于 1 红黑树的节点要么是红色, 要么是黑色, 这里的红黑色只是用来区分的一种方式, 为了定义规则 根节点一定是黑色 叶子节点也是黑色, 实际上叶子节点都是由 NULL 组成 红色节点的子节点是黑色 根节点到叶子节点的路径都.
1057 0