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

Java中HashMap 中的一個(gè)坑

這篇文章主要介紹了Java中HashMap中的一個(gè)坑,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)價(jià)值,需要的小伙伴可以參考一下

前言

最近公司的系統(tǒng)要增加一個(gè)新的列表展示功能,功能本身難度并不大,但遇到了一個(gè)很“奇怪”的問(wèn)題。小伙伴在執(zhí)行查詢列表時(shí),明明已經(jīng)使用了 order by 進(jìn)行排序了,但最終查詢出來(lái)的數(shù)據(jù)卻還是亂的。

預(yù)期中的(正確)結(jié)果: 

 現(xiàn)實(shí)中的(非預(yù)期)結(jié)果: 

 那到底是哪里出現(xiàn)了問(wèn)題呢?

問(wèn)題展示

為了方便展示,我把復(fù)雜的業(yè)務(wù)程序簡(jiǎn)化成了以下代碼:

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);
        });
    }
    // 查詢方法(簡(jiǎn)化版)
    public static HashMap<String, Object> getList() {
        HashMap<String, Object> result = new HashMap<>(); // 最終返回的結(jié)果集
        // 偽代碼:從數(shù)據(jù)庫(kù)中查詢出了數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行處理之后,存到了
        for (int i = 1; i <= 5; i++) {
            result.put("2022-10-" + i, "hello java" + i);
        }
        return result;
    }
}

以上程序的執(zhí)行結(jié)果如下: 

預(yù)期的結(jié)果應(yīng)該是按時(shí)間的先后順序展示的,如下圖所示: 

PS:以上示例代碼中,插入元素的順序是有序的(從 1 到 5),相當(dāng)于實(shí)際業(yè)務(wù)場(chǎng)景中的 order by。

原因分析

既然原數(shù)據(jù)使用了 order by 排序,那么原數(shù)據(jù)肯定是沒(méi)問(wèn)題的,那問(wèn)題就只會(huì)出現(xiàn)在返回集 HashMap 上,然后我們?cè)侔呀裹c(diǎn)放到 HashMap 上, 瞬間醒悟,哦,原來(lái)如此。HashMap 使用的是哈希方式進(jìn)行存儲(chǔ)的,因此存入和讀取的順序可能是不一致的,這也說(shuō) HashMap 是無(wú)序的集合,所以會(huì)導(dǎo)致插入的(或 order by 的)順序,與最終展示的順序不一致。

解決方案

經(jīng)過(guò)上面的分析我們順利找到了問(wèn)題,那接下來(lái)就是制定相應(yīng)的解決方案了,我想到的解決方案有兩個(gè):

  • 稍微麻煩一點(diǎn)但正確的解決方案:將返回的不確定數(shù)據(jù)類(lèi)型 HashMap 改為確定的數(shù)據(jù)類(lèi)型,比如 List;
  • 簡(jiǎn)單一點(diǎn)但并不是最優(yōu)的解決方案:將無(wú)序的 HashMap 改為有序的 LinkedHashMap,此方案的優(yōu)點(diǎn)是,只需要改動(dòng)一個(gè)單詞就可以解決整個(gè)問(wèn)題了。

第一種解決方案大家都懂這里就不演示了,接下來(lái)咱們使用第二種解決方案將上面的問(wèn)題改造一下,

最終的實(shí)現(xiàn)代碼如下:

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);
        });
    }

    // 查詢方法(簡(jiǎn)化版)
    public static HashMap<String, Object> getList() {
        HashMap<String, Object> result = new LinkedHashMap<>(); // 最終返回的結(jié)果集
        // 偽代碼:從數(shù)據(jù)庫(kù)中查詢出了數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行處理之后,存到了
        for (int i = 1; i <= 5; i++) {
            result.put("2022-10-" + i, "hello java" + i);
        }
        return result;
    }
}

以上程序的執(zhí)行結(jié)果如下: 

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

LinkedHashMap 的魔力

為什么 HashMap 是無(wú)序的,而 LinkedHashMap 卻是有序的呢?

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

總結(jié)

本文演示了 HashMap 作為返回類(lèi)型時(shí)隱藏的一個(gè)小“坑”,因?yàn)?HashMap 本身是無(wú)序的,所以它會(huì)導(dǎo)致查詢順序和插入順序不一致的問(wèn)題,對(duì)應(yīng)的解決方案有兩種:使用確定的數(shù)據(jù)類(lèi)型來(lái)替代 HashMap,比如 List,或者使用有序的 LinkedHashMap 來(lái)替代無(wú)序的 HashMap。

到此這篇關(guān)于Java中HashMap 中的一個(gè)坑的文章就介紹到這了,更多相關(guān)Java HashMap 內(nèi)容請(qǐng)搜索html5模板網(wǎng)以前的文章希望大家以后多多支持html5模板網(wǎng)!

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

相關(guān)文檔推薦

這篇文章主要介紹了Java中this和super的區(qū)別及this能否調(diào)用到父類(lèi)使用,this和super都是Java中常見(jiàn)的關(guān)鍵字,下文關(guān)于兩者區(qū)別介紹,需要的小伙伴可以參考一下
這篇文章主要介紹了Java中JUC?的?Exchange?交換器詳情,文章基于Java的相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下
主站蜘蛛池模板: 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 亚洲一区二区三区在线免费 | 一区二区成人 | 国产乱码精品一区二区三区忘忧草 | 国产东北一级毛片 | 成人av一区 | 免费在线观看一区二区 | 艹逼网| 成年人免费网站 | 欧美综合一区二区三区 | 中文字幕精品一区二区三区精品 | 欧美一级片在线看 | 亚洲一区不卡在线 | 亚洲成人一区二区 | 久久精品一区二区三区四区 | 欧美一级黄色免费看 | 精品国产乱码久久久久久中文 | 久久久久9999亚洲精品 | 免费精品| 妞干网视频 | 国产日韩一区二区三免费高清 | 国产一区二区三区 | 午夜成人免费视频 | 亚洲一区二区三区在线视频 | 国产成人精品一区二区三区网站观看 | 欧美精品在线一区二区三区 | 小川阿佐美pgd-606在线 | www.亚洲区 | 狠狠躁夜夜躁人人爽天天高潮 | 欧美精品一区二区三区在线 | 国产成人精品一区二区三区网站观看 | 在线播放国产一区二区三区 | 天天插天天舔 | 中文字幕日韩一区二区 | 日韩中文一区 | 91在线观看| h小视频 | 精品国产欧美一区二区三区成人 | 日本不卡在线视频 | 欧洲性生活视频 | 国产精品久久久久久福利一牛影视 |