1. 程式人生 > >HashSet的資料結構跟作用

HashSet的資料結構跟作用

(1) 為啥要用HahSet?     假如我們現在想要在一大堆資料中查詢X資料。LinkedList的資料結構就不說了,查詢效率低的可怕。ArrayList哪,如果我們不知道X的位置序號,還是一樣要全部遍歷一次直到查到結果,效率一樣可怕。HashSet天生就是為了提高查詢效率的。

HashSet的查詢效率高,我想是因為它是根據HashCode來儲存物件的,所以在查詢時,先計算出物件的HashCode,然後就可以根據這個來找出它的位置,查詢速度應該是O(1),不過看了下面的解釋,我這個猜想是錯的

HashSet的底層是基於HashMap的,就是說它的資料結構是跟HashMap一樣的。

但它儲存的是物件,在Entry中,物件對應的是Key,而Value是固定的一個值(所有的物件對應的Value都是那個值---Object物件PRESENT)這樣做的目的是為了符合HashMap的語法而已.

 4) HashSet 如何add機制

   假如我們有一個數據(雜湊碼76268),而此時的HashSet有128個雜湊單元,那麼這個資料將有可能插入到陣列的第108個連結串列中(76268%128=108)。但這只是有可能,如果在第108號連結串列中發現有一個老資料與新資料equals()=true的話,這個新資料將被視為已經加入,而不再重複丟入連結串列。

HashSet的雜湊單元大小如何指定?

  Java預設的雜湊單元大小全部都是2的冪,初始值為16(2的4次冪)。假如16條連結串列中的75%連結有資料的時候,則認為載入因子達到預設的0.75。HahSet開始重新雜湊,也就是將原來的雜湊結構全部拋棄,重新開闢一個雜湊單元大小為32(2的5次冪)的雜湊結果,並重新計算各個資料的儲存位置。以此類推下去.....

(5) 為什麼HashSet查詢效率提高了。

   知道了HashSet的add機制後,查詢的道理一樣。直接根據資料的雜湊碼和散列表的陣列大小計算除餘後,就得到了所在陣列的位置,然後再查詢連結串列中是否有這個資料即可。

   查詢的代價也就是在連結串列中,但是真正一條連結串列中的資料很少,有的甚至沒有。幾乎沒有什麼迭代的代價可言了。所以散列表的查詢效率建立在雜湊單元所指向的連結串列中的資料要少 。

總結:雖然HashSet實現的是Set介面,儲存時只是儲存物件,不用儲存鍵值對,但底層還是基於HashMap的,所以為了符合HashMap的語法,所有的物件都共享一個Object物件PRESENT為值