初次接觸哈希表,我談談自己對哈希表的一些理解,可能有誤,還望指正。
對於哈希表,存放的數據是鍵值對<key,value>。是按照鍵值來索引的,鍵key可以是字符串、單個字符、整形數等,值value就是存放結點數據。
通俗的說,對於哈希表,使用數組來存放基本的結點,每個結點在掛上一串鏈表構成的結構,如下圖所示:
數組存放的可以是不存儲任何數據的頭結點,我們的數據是存放在以為頭結點開始的鏈表上的。圖中的結點的中存放着鍵值對和指向下一個結點的指針。
索引原理:Java中是根據鍵進行二次哈希得到哈希值,再由哈希值&(array.length-1)映射到數組下標,或者用哈希值%array.length映射。不同的鍵可以映射到同一個數組下標,采用鏈表來解決哈希沖突。基本的原理也就是有key通過hash函數(hash變換)得到hash量,再由hash量通過變換映射到數組下標上,通常為取余操作%和與操作&。
總之,就是通過算法將key映射到數組下標上。
個人理解:數組下標的索引為常數復雜度,hash表就是利用這一點來提高搜索效率的,定位到key對應的數組位置只需要O(1)的復雜度,然后再對鏈表進行遍歷即可。
如果同樣的數據用數組進行存儲的話,數組長度為length,那么改用hash表來存儲,查找的效率可以提高length倍。
但是得注意:hash相同,但是key不一定相同。 key相同,則hash一定相同。
正因為如此,所以才會出現哈希沖突,有三種解決方法,下面的參考中有。這里哈希表采用外加鏈表法。
參考:
[1] http://m.blog.csdn.net/stayneckwind2/article/details/53574685
[2] http://m.blog.csdn.net/u014539992/article/details/52874819
[3] http://m.blog.csdn.net/u014613043/article/details/50726630
[4] http://m.blog.csdn.net/xiaotan2011929/article/details/61647556
參考視頻: