HashMap
- HashMap 是 Map 接口的實(shí)現(xiàn)類,允許使用 null 值 null 鍵,它不保證映射順序,特別是不保證該順序恒久不變,也非線程安全的
HashMap 內(nèi)部結(jié)構(gòu)
- HashMap 內(nèi)部是一個(gè)"鏈表散列"的數(shù)據(jù)結(jié)構(gòu)(是基于數(shù)組與引用),底層是一個(gè)數(shù)組,數(shù)組中的每一項(xiàng)又是一個(gè)鏈表 Entry 對象
- Entry 是一個(gè)靜態(tài)類,包含了 key-value 鍵值對對象,還包含了一個(gè) next 引用指向下一個(gè) Entry 對象
HashMap 擴(kuò)容
- 當(dāng) HashMap 內(nèi)的元素越來越多時(shí),hash 的沖突幾率也會越來越高,因?yàn)閿?shù)組的長度是固定的,為了提高效率就必須對數(shù)組進(jìn)行擴(kuò)容,但擴(kuò)容十分消耗性能,因?yàn)樵瓟?shù)組中的數(shù)據(jù)必須重新計(jì)算其在新數(shù)組中的位置,如果事先預(yù)知元素大小,那么預(yù)設(shè)個(gè)數(shù)就能提高性能
- 當(dāng) HashMap 中的元素個(gè)數(shù)超過 數(shù)組大小*loadFactor(加載因子)時(shí)就會進(jìn)行擴(kuò)容(默認(rèn)數(shù)組容量為 16、加載因子為0.75)
- 加載因子越高代表對空間的利用更充分,但查詢效率低
- 加載因子太小,數(shù)據(jù)太稀疏,浪費(fèi)了空間資源
HashMap 的 put()、get() 方法簡述
-
put 方法
- 當(dāng) put 元素時(shí),會先根據(jù) key 計(jì)算其 hashCode,決定該元素要存放在數(shù)組中哪個(gè)位置
- 如果該數(shù)組位置上沒有元素,則直接存放,如果已有元素,則存放在鏈頭
- 如果 key 已經(jīng)存在,新的 value 就會替換舊的 value,并返回舊的 value,否則返回 null
-
get 方法
- 當(dāng) get 元素時(shí),會先根據(jù) key 計(jì)算 hash 值求的元素對應(yīng)數(shù)組中的位置
- 再通過 equals() 方法判斷,從鏈表中取出 Entry
HashMap 用法
HashMap<String,Integer> hashMap = new HashMap<>();
hashMap.put("a",1);
hashMap.put("b",2);
hashMap.forEach((k,v)->{
System.out.println(k);
System.out.println(v);
});
HashSet
- HashSet 底層是基于 HashMap 實(shí)現(xiàn)的,因此它也非線程安全,也不能保證元素的插入順序
- 當(dāng) put 元素時(shí),如果元素不存在則添加,否則返回 false
- HashSet 跟 HashMap 一樣存儲著 <key,value> 結(jié)構(gòu)的 Entry 對象,但 HashSet 中的 value 都是 PRESENT
HashSet 用法
HashSet<Integer> integers = new HashSet<>();
integers.add(1);
integers.add(2);
integers.forEach(i -> System.out.println(i));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。