成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊 HashMap 中的一個“坑”!

開發 前端
本文演示了 HashMap 作為返回類型時隱藏的一個小“坑”,因為 HashMap 本身是無序的,所以它會導致查詢順序和插入順序不一致的問題。

[[433448]]

作者 | 王磊

來源 | Java中文社群(ID:javacn666) 

轉載請聯系授權(微信ID:GG_Stone)

最近公司新來了一個小伙伴,問了磊哥一個比較“奇怪”的問題,這個問題本身的難度并不大,但比較“隱蔽”,那究竟是什么問題呢?接下來我們一起來看。

起因

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

預期中的(正確)結果:

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

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

問題展示

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

  1. import java.util.HashMap; 
  2.  
  3. public class App { 
  4.  
  5.     public static void main(String[] args) { 
  6.         HashMap<String, Object> result = getList(); 
  7.         result.forEach((k, v) -> { 
  8.             System.out.println(k + ":" + v); 
  9.         }); 
  10.     } 
  11.  
  12.     // 查詢方法(簡化版) 
  13.     public static HashMap<String, Object> getList() { 
  14.         HashMap<String, Object> result = new HashMap<>(); // 最終返回的結果集 
  15.         // 偽代碼:從數據庫中查詢出了數據,然后對數據進行處理之后,存到了 
  16.         for (int i = 1; i <= 5; i++) { 
  17.             result.put("2022-10-" + i, "hello java" + i); 
  18.         } 
  19.         return result; 
  20.     } 

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

預期的結果應該是按時間的先后順序展示的,如下圖所示:

PS:以上示例代碼中,插入元素的順序是有序的(從 1 到 5),相當于實際業務場景中的 order by。

原因分析

既然原數據使用了 order by 排序,那么原數據肯定是沒問題的,那問題就只會出現在返回集 HashMap 上,然后我們再把焦點放到 HashMap 上, 瞬間醒悟,哦,原來如此。HashMap 使用的是哈希方式進行存儲的,因此存入和讀取的順序可能是不一致的,這也說 HashMap 是無序的集合,所以會導致插入的(或 order by 的)順序,與最終展示的順序不一致。

解決方案

經過上面的分析我們順利找到了問題,那接下來就是制定相應的解決方案了,我想到的解決方案有兩個:

  1. 稍微麻煩一點但正確的解決方案:將返回的不確定數據類型 HashMap 改為確定的數據類型,比如 List;
  2. 簡單一點但并不是最優的解決方案:將無序的 HashMap 改為有序的 LinkedHashMap,此方案的優點是,只需要改動一個單詞就可以解決整個問題了。

第一種解決方案大家都懂這里就不演示了,接下來咱們使用第二種解決方案將上面的問題改造一下,最終的實現代碼如下:

  1. import java.util.HashMap; 
  2. import java.util.LinkedHashMap; 
  3.  
  4. public class App { 
  5.  
  6.     public static void main(String[] args) { 
  7.         HashMap<String, Object> result = getList(); 
  8.         result.forEach((k, v) -> { 
  9.             System.out.println(k + ":" + v); 
  10.         }); 
  11.     } 
  12.  
  13.     // 查詢方法(簡化版) 
  14.     public static HashMap<String, Object> getList() { 
  15.         HashMap<String, Object> result = new LinkedHashMap<>(); // 最終返回的結果集 
  16.         // 偽代碼:從數據庫中查詢出了數據,然后對數據進行處理之后,存到了 
  17.         for (int i = 1; i <= 5; i++) { 
  18.             result.put("2022-10-" + i, "hello java" + i); 
  19.         } 
  20.         return result; 
  21.     } 

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

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

LinkedHashMap 的魔力

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

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

總結

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

 

責任編輯:姜華 來源: Java中文社群
相關推薦

2021-08-14 09:48:02

ReentrantLock多線編程

2022-03-02 08:20:54

并發編程java后端開發

2022-03-09 09:43:20

并發編程Java

2021-06-08 06:13:16

React開發開發技術

2022-03-22 06:33:49

Python內置模塊函數

2020-03-26 17:00:53

HashMapputJava

2022-04-08 08:48:16

線上事故日志訂閱者

2018-12-29 08:15:28

Tomcat應用部署

2022-05-26 08:12:52

debugSpringFeign

2022-11-08 08:35:53

架構微服務移動

2022-06-10 13:03:44

接口重試while

2023-06-20 08:25:53

NESTED源碼mybatis

2024-08-02 09:49:35

Spring流程Tomcat

2024-06-17 11:59:39

2019-11-21 10:20:05

SQL錯誤用法數據庫

2024-06-26 10:37:05

2017-11-08 12:51:12

2020-11-16 11:24:00

Spring AOP數據庫

2024-07-15 08:25:07

2022-03-06 19:57:50

狀態機easyfsm項目
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 麻豆亚洲| 国产在线精品一区二区三区 | 在线观看免费av网 | 美女天天操 | 国产黄色av电影 | 欧美精品在线免费 | 国产不卡视频在线 | 91亚洲精品久久久电影 | 欧洲视频一区 | 日韩精品免费视频 | 四虎永久免费黄色影片 | 国产美女一区二区 | 国产福利一区二区 | 亚洲精品成人在线 | 亚州春色 | 亚洲精品一区久久久久久 | 午夜男人免费视频 | 亚洲精品免费视频 | 久久久美女| 精品网站999www| 免费同性女女aaa免费网站 | 视频在线观看一区 | 欧美一级黄带 | 国产日韩欧美另类 | 欧美精品 在线观看 | 91视频88av | 久久久久久久国产精品 | 青青草这里只有精品 | 国产香蕉视频 | 欧美在线视频一区二区 | 欧美乱人伦视频 | 久久久久国产成人精品亚洲午夜 | 国产成人综合久久 | 99热精品国产 | 人人澡人人射 | 日韩国产中文字幕 | 午夜在线观看免费 | 久草热线| 日韩福利视频 | 嫩草伊人| 91国产视频在线 |