| 企服解答
Hashmap 中文名哈希映射,是基于哈希表的 Map 接口的實(shí)現(xiàn),HashMap 是一個(gè)用于存儲(chǔ) Key-Value 鍵值對(duì)的集合。此實(shí)現(xiàn)提供了所有可選的映射操作,并允許空值和空鍵。HashMap 主要通過 key 存儲(chǔ) value 值,并且提供了添加,獲取和操作存儲(chǔ) value 的方法。HashMap 的實(shí)現(xiàn)基于 HashTable。
hashmap是什么
HashMap 的特點(diǎn)包括:
1、底層實(shí)現(xiàn)是 鏈表數(shù)組,JDK 8 后又加了 紅黑樹
2、實(shí)現(xiàn)了 Map 全部的方法
3、key 用 Set 存放,所以想做到 key 不允許重復(fù),key 對(duì)應(yīng)的類(一般是 String)需要重寫 hashCode 和 equals 方法
4、允許空鍵和空值(但空鍵只有一個(gè),且放在第一位,知道就行)
5、元素是無序的,而且順序會(huì)不定時(shí)改變(每次擴(kuò)容后,都會(huì)重新哈希,也就是 key 通過哈希函數(shù)計(jì)算后會(huì)得出與之前不同的哈希值,這就導(dǎo)致哈希表里的元素是沒有順序,會(huì)隨時(shí)變化的,這是因?yàn)楣:瘮?shù)與桶數(shù)組容量有關(guān),每次結(jié)點(diǎn)到了臨界值后,就會(huì)自動(dòng)擴(kuò)容,擴(kuò)容后桶數(shù)組容量都會(huì)乘二,而 key 不變,那么哈希值一定會(huì)變)
6、插入、獲取的時(shí)間復(fù)雜度基本是 O(1)(前提是有適當(dāng)?shù)墓:瘮?shù),讓元素分布在均勻的位置)
7、遍歷整個(gè) Map 需要的時(shí)間與數(shù)組的長(zhǎng)度成正比(因此初始化時(shí) HashMap 的容量不宜太大)
8、兩個(gè)關(guān)鍵因子:初始容量、加載因子
| 拓展閱讀
HashMap基于hashing原理,我們通過put()和get()方法儲(chǔ)存和獲取對(duì)象。當(dāng)我們將鍵值對(duì)傳遞給put()方法時(shí),它調(diào)用鍵對(duì)象的hashCode()方法來計(jì)算hashcode,讓后找到bucket位置來儲(chǔ)存值對(duì)象。當(dāng)獲取對(duì)象時(shí),通過鍵對(duì)象的equals()方法找到正確的鍵值對(duì),然后返回值對(duì)象。HashMap使用鏈表來解決碰撞問題,當(dāng)發(fā)生碰撞了,對(duì)象將會(huì)儲(chǔ)存在鏈表的下一個(gè)節(jié)點(diǎn)中。 HashMap在每個(gè)鏈表節(jié)點(diǎn)中儲(chǔ)存鍵值對(duì)對(duì)象。
[免責(zé)聲明]
文章標(biāo)題: hashmap是什么
文章內(nèi)容為網(wǎng)站編輯整理發(fā)布,僅供學(xué)習(xí)與參考,不代表本網(wǎng)站贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé)。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)溝通。發(fā)送郵件至36dianping@36kr.com,我們會(huì)在3個(gè)工作日內(nèi)處理。