自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Map的Key你真的了解嗎?

開發(fā) 前端
如果你使用一個(gè)可變對象作為Key,比如一個(gè)List,情況會變得復(fù)雜。如果在存入HashMap后,你修改了List的內(nèi)容,它的hashCode就會改變,導(dǎo)致HashMap無法正確找到存儲的位置。

何類作為Map的Key?為什么HashMap中String、Integer這樣的包裝類適合作為Key?如果使用Object作為HashMap的Key,應(yīng)該怎么辦?” 這個(gè)問題看似簡單,但實(shí)際上涉及到HashMap的核心機(jī)制,面試中說得清楚絕對能讓面試官眼前一亮!

話不多說,讓我們通過一個(gè)小故事,邊學(xué)邊聊。

初識問題:能否使用任何類作為Map的Key?

故事從小明找工作說起。小明在面試時(shí)被問到:“你能用任何類作為Map的Key嗎?”

小明想了想,答:“理論上可以吧,但會有坑?!?/p>

沒錯(cuò),理論上任何類都可以作為Map的Key。但是!能否真正高效和正確地使用,得滿足兩個(gè)條件:

  • 必須重寫hashCode()方法:這是因?yàn)镠ashMap基于哈希表實(shí)現(xiàn),hashCode()決定了對象的存儲位置。
  • 必須重寫equals()方法:當(dāng)兩個(gè)對象的hashCode相同,HashMap會使用equals()方法來判斷它們是否真的相等。

如果你用的類沒有重寫這兩個(gè)方法,HashMap就可能無法正確判斷Key是否相等,導(dǎo)致奇怪的行為。比如,明明存進(jìn)去了,卻取不出來。

為什么String和Integer適合作為Key?

接著,面試官進(jìn)一步追問:“那為什么String和Integer這樣的包裝類適合作為Key呢?”

小明頓時(shí)慌了,但冷靜下來,他回憶起學(xué)過的知識,侃侃而談。

String

  • String的hashCode()實(shí)現(xiàn)簡單明了,基于內(nèi)容計(jì)算哈希值。
  • 它的equals()方法也是內(nèi)容比較,完全符合HashMap的需求。
  • 不可變性:String是不可變類,哈希值一旦計(jì)算,就不會因內(nèi)容變化而失效。

Integer

  • Integer的hashCode()直接返回它的值,簡單高效。
  • equals()也是基于值的比較。
  • 同樣是不可變的包裝類,Key的狀態(tài)不會因外部修改而改變。

對比之下,如果你使用一個(gè)可變對象作為Key,比如一個(gè)List,情況會變得復(fù)雜。如果在存入HashMap后,你修改了List的內(nèi)容,它的hashCode就會改變,導(dǎo)致HashMap無法正確找到存儲的位置。

如果使用Object作為Key,該怎么辦?

這時(shí),面試官繼續(xù)刁難:“假如我想用自己的類Person作為Key呢?”

小明心里有底了,他微微一笑:“那就得自己實(shí)現(xiàn)hashCode()和equals()方法了。”

如何實(shí)現(xiàn)?

以下是小明舉的例子:

圖片圖片

  • hashCode():使用Objects.hash()方法將name和age的值組合成一個(gè)哈希值,保證哈希分布的均勻性。
  • equals():確保當(dāng)兩個(gè)對象的name和age都相同時(shí),它們被認(rèn)為是相等的。

避坑指南:Key需要注意哪些問題?

1、不可變性

Key最好是不可變的(如String和Integer),否則會導(dǎo)致數(shù)據(jù)一致性問題。

2、重寫規(guī)則一致

如果你重寫了equals(),就必須重寫hashCode(),并保證規(guī)則一致:

  • 如果兩個(gè)對象相等(equals()返回true),它們的hashCode必須相等。
  • 如果兩個(gè)對象不相等,它們的hashCode盡量不同。

3、合理選擇Key

如果使用復(fù)雜對象作為Key,確保它的字段值不會頻繁變動,否則建議使用唯一標(biāo)識符(如ID)。

總結(jié)

面試結(jié)束后,小明總結(jié)道:

  • 能否使用任何類作為Map的Key?:可以,但必須保證重寫hashCode()和equals()方法。
  • 為什么String和Integer適合作為Key?:它們有良好的hashCode()和equals()實(shí)現(xiàn),并且是不可變類。
  • 如果使用自定義類作為Key?:重寫hashCode()和equals()方法,確保Key的唯一性和一致性。
責(zé)任編輯:武曉燕 來源: 軟件求生
相關(guān)推薦

2022-07-26 00:00:22

HTAP系統(tǒng)數(shù)據(jù)庫

2014-04-17 16:42:03

DevOps

2019-09-16 08:40:42

2014-11-28 10:31:07

Hybrid APP

2020-02-27 10:49:26

HTTPS網(wǎng)絡(luò)協(xié)議TCP

2023-03-16 10:49:55

2021-01-15 07:44:21

SQL注入攻擊黑客

2021-11-09 09:48:13

Logging python模塊

2018-01-06 10:38:51

Ping抓包 ICMP協(xié)議

2023-11-01 13:48:00

反射java

2021-11-26 08:07:16

MySQL SQL 語句數(shù)據(jù)庫

2024-02-02 08:50:20

Node.js元數(shù)據(jù)自動化

2017-10-18 22:01:12

2023-10-24 08:53:24

FutureTas并發(fā)編程

2012-05-31 09:56:54

云安全

2015-07-31 10:35:18

實(shí)時(shí)計(jì)算

2022-12-12 08:46:11

2019-11-06 09:52:01

JavaScript單線程非阻塞

2022-03-14 07:53:27

ELTETL大數(shù)據(jù)

2024-01-29 10:09:59

數(shù)據(jù)庫INT(3)INT(11)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號