散列表介紹:數組
數組和鏈表均可以是有序的(即存儲順序與取出順序一致),但這樣是有代價的,須要遍歷才能夠尋找某一特定元素;函數
而還有另外的一些存儲結構:不在乎元素的順序,可以快速的查找元素的數據spa
其中就有一種很是常見的:散列表設計
散列表爲每一個對象計算出一個整數,稱爲散列碼。根據這些計算出來的整數(散列碼)保存在對應的位置上!3d
在Java中,散列表用的是鏈表數組實現的,每一個列表稱之爲桶。code
一個桶上可能會遇到被佔用的狀況(hashCode散列碼相同,就存儲在同一個位置上),這種狀況是沒法避免的,這種現象稱之爲:散列衝突對象
若是散列表太滿,是須要對散列表再散列,建立一個桶數更多的散列表,並將原有的元素插入到新表中,丟棄原來的表~blog
平衡樹:知足平衡條件的樹;排序
AVL樹,帶有平衡條件的二叉排序樹(平衡條件:每一個節點的左子樹和右子樹的高度最多差 1);索引
紅黑樹:
在2-3樹的理論基礎上發明了紅黑樹(2-3-4樹也是一樣的道理,只是2-3樹是最簡單的一種狀況,因此我就不說2-3-4樹了)。
紅黑樹是對2-3查找樹的改進,它能用一種統一的方式完成全部變換。
紅黑樹用的是也是兩種方式來替代2-3樹不斷的節點交換操做:
紅黑樹爲了保持平衡,還有制定一些約束,遵照這些約束的才能叫作紅黑樹:
咱們知道Hash存儲的底層是散列表,而在Java中散列表的實現是經過數組+鏈表的~我
咱們能夠簡單總結出HashMap:
咱們是根據key的哈希值來保存在散列表中的,咱們表默認的初始容量是16,要放到散列表中,就是0-15的位置上。也就是tab[i = (n - 1) & hash]
。能夠發現的是:在作&
運算的時候,僅僅是後4位有效~那若是咱們key的哈希值高位變化很大,低位變化很小。直接拿過去作&
運算,這就會致使計算出來的Hash值相同的不少。
而設計者將key的哈希值的高位也作了運算(與高16位作異或運算,使得在作&運算時,此時的低位其實是高位與低位的結合),這就增長了隨機性,減小了碰撞衝突的可能性!