回覆列表
-
1 # 程式設計頌
-
2 # 三僡然
首先上面是hash的類說明,說明hash可能是無序也可能是有序。問什麼會這樣讓我們看下hashset的原始碼實現。
hashset 底層是透過key為null的hashmap 儲存的。
HashMap的資料結構是table[entry],entry是一個連結串列結構,資料的每個元素是一個連結串列。不同key,但是具有相同hashcode會落在table[hashcode]的連結串列上。
但是HashMap存值的時候會根據key的hashCode()來計算儲存的位置(位置是雜湊的,所以說其無序);
感覺有序是因為hashcode()直沒有重複。樣本太少原因
先明白一個道理,不保證有序和保證無序完全不一樣!
所以在HashSet儲存的int比較少的時候是可能出現有序的!
為什麼幾十個數字的HashSet輸出還是有序的呢?
版本原因不同版本的java在HashSet資料佈局上面可能有所差異,所以你可能會發現在jdk7版本之前資料可能是無序的,但是在jdk7版本之後資料輸出是有序的。
hashcode我們知道對於int型別來說,它的hashcode就是int值本身。
在[0,2^32-1]這個區域經過的時候,HashSet.hash()得到的還是自己本身,外加load factor在某些例子之中並未使得hash發生衝突,所以導致元素按照大小順序依次插入到HashSet的雜湊表之中。所以依次輸出會呈現從小到大排列。