作者主頁(yè):Designer 小鄭
作者簡(jiǎn)介:3年JAVA全棧開(kāi)發(fā)經(jīng)驗(yàn),專注JAVA技術(shù)、系統(tǒng)定制、遠(yuǎn)程指導(dǎo),致力于企業(yè)數(shù)字化轉(zhuǎn)型,CSDN學(xué)院、藍(lán)橋云課認(rèn)證講師。
主打方向:Vue、SpringBoot、微信小程序
本文講解了 Java 中集合類 HashMap 的語(yǔ)法、使用說(shuō)明和應(yīng)用場(chǎng)景,并給出了樣例代碼。
一、什么是HashMap
HashMap 是 Java 集合框架中的一種實(shí)現(xiàn)了 Map 接口的鍵值對(duì)存儲(chǔ)結(jié)構(gòu)。它使用哈希表來(lái)存儲(chǔ)數(shù)據(jù),并根據(jù)鍵的哈希值來(lái)決定存儲(chǔ)的位置,從而實(shí)現(xiàn)快速的插入、刪除和查找操作。
HashMap 中的鍵和值可以是任意類型的對(duì)象,但要求鍵是唯一的,而值可以重復(fù)。HashMap 允許使用null作為鍵和值,并且允許存儲(chǔ)null鍵對(duì)應(yīng)的值。
HashMap 的內(nèi)部實(shí)現(xiàn)是基于數(shù)組和鏈表(或紅黑樹(shù))的組合結(jié)構(gòu),每個(gè)數(shù)組元素稱為桶 bucket
,每個(gè)桶中存儲(chǔ)了若干個(gè)鍵值對(duì)的鏈表(或紅黑樹(shù))。當(dāng)存儲(chǔ)和檢索數(shù)據(jù)時(shí),根據(jù)鍵的哈希值通過(guò)哈希函數(shù)計(jì)算出在數(shù)組中的位置,然后在對(duì)應(yīng)的鏈表(或紅黑樹(shù))中進(jìn)行操作。
HashMap 提供了高效的插入、刪除和查找操作,并且具有較快的訪問(wèn)速度。但是在遍歷操作時(shí),元素的順序是不確定的,因?yàn)?HashMap 中的數(shù)據(jù)是無(wú)序存儲(chǔ)的。
需要注意的是,HashMap 是非線程安全的,如果在多線程環(huán)境下并發(fā)修改 HashMap,可能會(huì)導(dǎo)致數(shù)據(jù)不一致或出現(xiàn)異常。如果需要在多線程環(huán)境中使用 HashMap,可以使用 ConcurrentHashMap
或使用 Collections
類的 synchronizedMap
方法對(duì) HashMap 進(jìn)行包裝,使其變?yōu)榫€程安全的。
二、HashMap類的使用
HashMap 類提供了一系列的方法來(lái)操作鍵值對(duì)數(shù)據(jù)。以下是 HashMap 類的一些常用方法及其使用示例代碼,請(qǐng)同學(xué)們認(rèn)真學(xué)習(xí)。
2.1 添加鍵值對(duì) put(K key, V value)
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 5);
map.put("orange", 8);
2.2 獲取值 get(Object key)
Integer value = map.get("apple");
System.out.println(value); // 輸出:10
2.3 檢查是否包含指定鍵 containsKey(Object key)
boolean containsKey = map.containsKey("banana");
System.out.println(containsKey); // 輸出:true
2.4 檢查是否包含指定值 containsValue(Object value)
boolean containsValue = map.containsValue(8);
System.out.println(containsValue); // 輸出:true
2.5 刪除指定鍵值對(duì) remove(Object key)
map.remove("orange");
2.6 獲取鍵的集合 keySet()
Set<String> keySet = map.keySet();
for (String key : keySet) {
System.out.println(key); // 輸出:apple, banana
}
2.7 獲取值的集合 values()
Collection<Integer> values = map.values();
for (Integer value : values) {
System.out.println(value); // 輸出:10, 5
}
2.8 獲取鍵值對(duì)的集合 entrySet()
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
System.out.println(entry.getKey() + ": " + entry.getValue()); // 輸出:apple: 10, banana: 5
}
以上是 HashMap 類的一些常用方法的使用示例代碼,通過(guò)這些方法,同學(xué)們可以實(shí)現(xiàn)對(duì) HashMap 中的鍵值對(duì)進(jìn)行添加、獲取、刪除、遍歷等操作。
三、HashMap 類的應(yīng)用場(chǎng)景
HashMap 類是Java中的一個(gè)常用數(shù)據(jù)結(jié)構(gòu),它實(shí)現(xiàn)了 Map 接口,并基于哈希表實(shí)現(xiàn),HashMap 類提供了一種用于存儲(chǔ)鍵值對(duì)的方式,并且它的查找、插入和刪除操作都具有很高的效率,下面是一些HashMap類的常見(jiàn)應(yīng)用場(chǎng)景,請(qǐng)同學(xué)們認(rèn)真學(xué)習(xí)。
- 緩存:HashMap 可用于實(shí)現(xiàn)緩存,通過(guò)將數(shù)據(jù)存儲(chǔ)在 HashMap 中,可以快速地查找和獲取數(shù)據(jù),避免了頻繁的 IO 操作或者計(jì)算操作。
- 數(shù)據(jù)索引:HashMap 可以用于構(gòu)建索引數(shù)據(jù)結(jié)構(gòu),例如在數(shù)據(jù)庫(kù)查詢中可以使用 HashMap 將查詢結(jié)果的關(guān)鍵字與對(duì)應(yīng)的數(shù)據(jù)關(guān)聯(lián)起來(lái),從而快速定位所需的數(shù)據(jù)。
- 存儲(chǔ)配置信息:HashMap 可以用于存儲(chǔ)配置信息,例如將配置項(xiàng)的名稱作為鍵,將配置項(xiàng)的值作為值,這樣可以通過(guò)鍵快速找到對(duì)應(yīng)的配置值。
- 統(tǒng)計(jì)數(shù)據(jù):HashMap 可以用于統(tǒng)計(jì)數(shù)據(jù),例如統(tǒng)計(jì)文章中單詞的出現(xiàn)頻率,將單詞作為鍵,將頻率作為值,通過(guò)鍵快速找到對(duì)應(yīng)的頻率值。
- 數(shù)據(jù)分組:HashMap 可以用于將數(shù)據(jù)按照一定的條件進(jìn)行分組,例如將學(xué)生按照班級(jí)進(jìn)行分組,將班級(jí)作為鍵,將學(xué)生列表作為值。
總之,HashMap 類在 Java 中的應(yīng)用非常廣泛,可以用于各種場(chǎng)景下的數(shù)據(jù)存儲(chǔ)和操作,它的高效性和靈活性使得它成為了 Java 開(kāi)發(fā)中常用的數(shù)據(jù)結(jié)構(gòu)之一。
四、HashMap面試題
一、HashMap 的工作原理是什么?
- HashMap 是基于哈希表實(shí)現(xiàn)的,使用鍵-值對(duì)的方式存儲(chǔ)數(shù)據(jù)。
- 存儲(chǔ)過(guò)程:通過(guò)將鍵進(jìn)行哈希計(jì)算,將其映射到哈希表的某個(gè)位置,然后將值存儲(chǔ)在該位置。
- 檢索過(guò)程:通過(guò)相同的哈希計(jì)算得到鍵的位置,然后在該位置找到對(duì)應(yīng)的值。
- 當(dāng)多個(gè)鍵映射到同一個(gè)位置時(shí),使用鏈表或紅黑樹(shù)解決沖突。
二、HashMap和HashTable有什么區(qū)別?
- HashMap 是非線程安全的,而 HashTable 是線程安全的。
- HashMap 允許 n u l l null null 鍵和 n u l l null null 值,而 HashTable 不支持。
- HashMap 的迭代器是
fail-fast
的,而 HashTable 的迭代器不是。
三、如何解決 HashMap 的沖突問(wèn)題?
- 當(dāng)多個(gè)鍵映射到同一個(gè)位置時(shí),HashMap 使用鏈表或紅黑樹(shù)解決沖突。
- 當(dāng)鏈表長(zhǎng)度達(dá)到一定閾值時(shí),鏈表會(huì)轉(zhuǎn)換為紅黑樹(shù),以提高查找效率。
四、什么情況下需要重寫 hashCode ()和 equals() 方法?
- 當(dāng)自定義類作為HashMap的鍵時(shí),需要重寫
hashCode()
和equals()
方法。 -
hashCode()
方法用于計(jì)算鍵的哈希值,equals()
方法用于比較兩個(gè)鍵是否相等。
五、如何實(shí)現(xiàn) HashMap 的排序?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-612957.html
- HashMap 本身是無(wú)序的,如果需要對(duì) HashMap 進(jìn)行排序,可以使用 TreeMap 來(lái)實(shí)現(xiàn)有序存儲(chǔ)。
五、總結(jié)
本文講解了 Java 中集合類 HashMap 的語(yǔ)法、使用說(shuō)明和應(yīng)用場(chǎng)景,并給出了樣例代碼。在下一篇博客中,將講解 Java 中 TreeMap 類的知識(shí)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-612957.html
到了這里,關(guān)于【JavaSE專欄53】Java集合類HashMap解析,基于哈希表的鍵值對(duì)存儲(chǔ)結(jié)構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!