Java HashMap 與 HashSet

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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容