哈希表也叫散列表,是一種神奇的結構,最大的特點就是快。它的結構有很多種,最流行、最容易理解的是:順序表+鏈表的結構。主結構是長度可以動態變化的順序表,每個順序表的節點可以單獨引出一個鏈表。哈希表的原理可以從以下三點闡述。
添加數據原理:
1)、計算哈希碼,調用hashCode()方法,結果是一個int值,整數的哈希碼取自身即可
2)、根據哈希碼計算存儲位置(數組的索引)【y = k(x) (除留取余法)存入哈希表】
3)、將數據存入指定位置,如果已經有元素存在,就是出現了沖突,需要沿着鏈表比較,有重復的元素,不存儲。沒有,就存儲。
結論:添加快。時間復雜度O(1);無序。
查詢數據的原理:
和添加過程一樣,還是三步搞定。結論:查詢快。
總結:哈希表的神奇之處在於按照內容查詢,理想情況下可以達到數組索引查詢的時間復雜度O(1)。核心在於其查詢不是基於比較的,而是基於計算的。當存在沖突時,會降低效率。
如何減少沖突:
1)裝填因子:哈希表的長度和表中的記錄數的比例。超過裝填因子就要擴容。不然沖突的概率會大大提高,從而影響性能。
2)哈希函數的選擇
直接定址法 平方取中發 折疊法 除留取余法等
3)處理沖突的方法
鏈地址法 開放地址法 再散列法 建立一個公共溢出區
hashCode和equals()在哈希表添加查詢中的作用:
1)hashCode():計算哈希碼,是一個整數,根據哈希碼可以計算出數據在哈希表中的存儲位置。
2)equals():添加時出現了沖突,需要通過equals進行比較,判斷是否相同,查詢時也需要使用equals進行比較,判斷是否相同。