久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

Java中HashMap 中的一個坑

這篇文章主要介紹了Java中HashMap中的一個坑,文章圍繞主題展開詳細的內容介紹,具有一定的參考價價值,需要的小伙伴可以參考一下

前言

最近公司的系統要增加一個新的列表展示功能,功能本身難度并不大,但遇到了一個很“奇怪”的問題。小伙伴在執行查詢列表時,明明已經使用了 order by 進行排序了,但最終查詢出來的數據卻還是亂的。

預期中的(正確)結果: 

 現實中的(非預期)結果: 

 那到底是哪里出現了問題呢?

問題展示

為了方便展示,我把復雜的業務程序簡化成了以下代碼:

import java.util.HashMap;
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 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) {
        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;
    }
}

以上程序的執行結果如下: 

 從上述結果可以看出,當使用 LinkedHashMap 替代了 HashMap 之后,返回的順序就能和插入的順序保持一致了。

LinkedHashMap 的魔力

為什么 HashMap 是無序的,而 LinkedHashMap 卻是有序的呢?

這要從二者的實現說起了,LinkedHashMap 屬于 HashMap 的子類,所以 LinkedHashMap 除了擁有 HashMap 的所有特性之后,還具備自身的一些擴展屬性,其中就包括 LinkedHashMap 中額外維護了一個雙向鏈表,這個雙向鏈表就是用來保存元素的(插入)順序的,這也是為什么 LinkedHashMap 可以實現訪問順序和插入順序一致的原因了。

總結

本文演示了 HashMap 作為返回類型時隱藏的一個小“坑”,因為 HashMap 本身是無序的,所以它會導致查詢順序和插入順序不一致的問題,對應的解決方案有兩種:使用確定的數據類型來替代 HashMap,比如 List,或者使用有序的 LinkedHashMap 來替代無序的 HashMap。

到此這篇關于Java中HashMap 中的一個坑的文章就介紹到這了,更多相關Java HashMap 內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

這篇文章主要介紹了Java中this和super的區別及this能否調用到父類使用,this和super都是Java中常見的關鍵字,下文關于兩者區別介紹,需要的小伙伴可以參考一下
這篇文章主要介紹了Java中JUC?的?Exchange?交換器詳情,文章基于Java的相關資料展開詳細的內容介紹,需要的小伙伴可以參考一下
主站蜘蛛池模板: 欧美一区二区三区电影 | 欧美在线视频a | 91在线电影 | 一本一道久久a久久精品蜜桃 | 999免费视频| 日韩精品在线免费 | 精品在线一区 | m豆传媒在线链接观看 | 精品区一区二区 | 免费观看的黄色网址 | 日韩手机在线看片 | 日韩欧美国产一区二区 | 欧美日韩久久久久 | 日韩在线视频网址 | www.久久99| 视频一区二区在线观看 | 久久久精| 久久久久国产精品免费免费搜索 | 欧美激情在线一区二区三区 | 老司机久久 | 91在线资源| 一区二区三区国产精品 | 欧美成人精品在线 | 日韩中文不卡 | 成人av免费 | 国产午夜精品视频 | 成人在线中文字幕 | 国产精品久久久久久吹潮日韩动画 | 国产精品久久久久久久久久久久 | 免费看欧美一级片 | 午夜精品一区二区三区三上悠亚 | 特级做a爰片毛片免费看108 | 视频二区在线观看 | 国产激情视频网站 | 大象视频一区二区 | 日韩视频区 | 91综合网 | 久久精品99国产精品 | 国产一区二区三区高清 | 天堂av免费观看 | 国内av在线|