HashMap 中的一個“坑”!
閱讀本文大概需要 3 分鐘。
最近公司新來了一個小伙伴,問了磊哥一個比較“奇怪”的問題,這個問題本身的難度并不大,但比較“隱蔽”,那究竟是什么問題呢?接下來我們一起來看。起因


問題展示
import?java.util.HashMap;
public?class?App?{
????public?static?void?main(String[]?args)?{
????????HashMap?result?=?getList();
????????result.forEach((k,?v)?->?{
????????????System.out.println(k?+?":"?+?v);
????????});
????}
????//?查詢方法(簡化版)
????public?static?HashMap?getList()? {
????????HashMap?result?=?new?HashMap<>();?//?最終返回的結(jié)果集
????????//?偽代碼:從數(shù)據(jù)庫中查詢出了數(shù)據(jù),然后對數(shù)據(jù)進(jìn)行處理之后,存到了
????????for?(int?i?=?1;?i?<=?5;?i++)?{
????????????result.put("2022-10-"?+?i,?"hello?java"?+?i);
????????}
????????return?result;
????}
}


PS:以上示例代碼中,插入元素的順序是有序的(從 1 到 5),相當(dāng)于實際業(yè)務(wù)場景中的 order by。
原因分析
解決方案
稍微麻煩一點(diǎn)但正確的解決方案:將返回的不確定數(shù)據(jù)類型 HashMap 改為確定的數(shù)據(jù)類型,比如 List ; 簡單一點(diǎn)但并不是最優(yōu)的解決方案:將無序的 HashMap 改為有序的 LinkedHashMap,此方案的優(yōu)點(diǎn)是,只需要改動一個單詞就可以解決整個問題了。
import?java.util.HashMap;
import?java.util.LinkedHashMap;
public?class?App?{
????public?static?void?main(String[]?args)?{
????????HashMap?result?=?getList();
????????result.forEach((k,?v)?->?{
????????????System.out.println(k?+?":"?+?v);
????????});
????}
????//?查詢方法(簡化版)
????public?static?HashMap?getList()? {
????????HashMap?result?=?new?LinkedHashMap<>();?//?最終返回的結(jié)果集
????????//?偽代碼:從數(shù)據(jù)庫中查詢出了數(shù)據(jù),然后對數(shù)據(jù)進(jìn)行處理之后,存到了
????????for?(int?i?=?1;?i?<=?5;?i++)?{
????????????result.put("2022-10-"?+?i,?"hello?java"?+?i);
????????}
????????return?result;
????}
}

LinkedHashMap 的魔力
總結(jié)
推薦閱讀:
阿里領(lǐng)導(dǎo):手下兩個應(yīng)屆生,一個踏實喜歡加班,一個技術(shù)強(qiáng)挑活,怎么選?
MySQL 性能優(yōu)化的 9 種姿勢,面試再也不怕了!
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
朕已閱?

