java的HashMap的幾個問題

來源:互聯網
上載者:User

標籤:hash表   動態   bubuko   根據   detail   bin   要求   產生   因子   

HashMap處理hash衝突的幾種方法一、 開放定址法

Hi=(H(key) + di) MOD m i=1,2,...k(k<=m-1)其中H(key)為雜湊函數;m為雜湊表表長;di為增量序列。

開放定址法根據步長不同可以分為3種:

1)線性探查法(Linear Probing):di=1,2,3,...,m-1
  簡單地說就是以當前衝突位置為起點,步長為1迴圈尋找,直到找到一個空的位置就把元素插進去,迴圈完了都找不到說明容器滿了。就像你去一條街上的店裡吃飯,問了第一家被告知滿座,然後挨著一家家去問是否有位置一樣。

2)線性補償探測法:di=Q 下一個位置滿足 Hi=(H(key) + Q) mod m i=1,2,...k(k<=m-1) ,要求 Q 與 m 是互質的,以便能探測到雜湊表中的所有單元。
繼續用上面的例子,現在你不是挨著一家家去問了,拿出計算機算了一下,然後隔Q家問一次有沒有位置。

3)偽隨機探測再散列:di=偽隨機數序列。還是那個例子,這是完全根據心情去選一家店來問了

缺點:

  • 這種方法建立起來的hash表當衝突多的時候資料容易堆聚在一起,這時候對尋找不友好;
  • 刪除結點不能簡單地將被刪結 點的空間置為空白,否則將截斷在它之後填人散列表的同義字結點的尋找路徑。因此在 用開放地址法處理衝突的散列表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點
  • 當空間滿了,還要建立一個溢出表來存多出來的元素。
二、再雜湊法

Hi = RHi(key),i=1,2,...k
RHi均是不同的雜湊函數,即在同義字產生地址衝突時計算另一個雜湊函數地址,直到不發生衝突為止。這種方法不易產生聚集,但是增加了計算時間。

缺點:增加了計算時間。

三、建立一個公用溢出區

假設雜湊函數的範圍為[0,m-1],則設向量HashTable[0...m-1]為基本表,每個分量存放一個記錄,另設立向量OverTable[0....v]為溢出表。所有關鍵字和基本表中關鍵字為同義字的記錄,不管他們由雜湊函數得到的雜湊地址是什麼,一旦發生衝突,都填入溢出表。

簡單地說就是搞個新表存衝突的元素。

四、鏈地址法(拉鏈法)

將所有關鍵字為同義字的記錄儲存在同一線性鏈表中,也就是把衝突位置的元素構造成鏈表。

拉鏈法的優點:

  • 拉鏈法處理衝突簡單,且無堆積現象,即非同義字決不會發生衝突,因此平均尋找長度較短;
  • 由於拉鏈法中各鏈表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
  • 在用拉鏈法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪去鏈表上相應的結點即可。

拉鏈法的缺點:

  • 指標需要額外的空間,故當結點規模較小時,開放定址法較為節省空間的,而若將節省的指標空間用來擴大散列表的規模,可使裝填因子變小,這又減少了開放定址法中的衝突,從而提高平均尋找速度

 

HashMap在java1.8中為什麼用紅/黑樹狀結構?

   在jdk1.8版本後,java對HashMap做了改進,在鏈表長度大於8的時候,將後面的資料存在紅/黑樹狀結構中,以加快檢索速度。

 舉例:HashMap的put操作:

 

HashMap中數組的長度為什麼是2的n次冪?

   在HashMap中採用indexFor方法返回儲存該對象的位置資訊:

static int indexFor(int h,int length){    return  h & (length - 1);}static int hash(int h){    h ^= (h >>> 20) ^ (h >>>12);    return h ^ (h >>> 7) ^ (h >>> 4);}

   所以數組長度是2的n次方:

  1.  h & (table.length - 1)的到對象的儲存位,2的n次冪減去1在每個位元的值都是1,全部為1進行與操作速度會大大提高;
  2. 數組長度為2的n次慕時候,不同的key值算得的index相同機率較小,減小了hash碰撞的幾率,同樣查詢也不需要總是遍曆鏈表,查詢的效率得到了提高;

 

 



參考:
連結:https://www.jianshu.com/p/dff8f4641814

連結:75331926

 

java的HashMap的幾個問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.