2015-06-05 34 views
1

我在想如何確定HashSet中元素的位置。它是通過一些內置的散列函數嗎?爲什麼HashSet中的元素是隨機順序的?

Set <String>set=new HashSet<String>(); 
    set.add("January"); 
    set.add("February"); 
    set.add("July"); 
    set.add("August"); 
    set.add("September"); 
    set.add("October"); 
    set.add("Novermber"); 
    set.add("December"); 
    set.add("March"); 
    set.add("April"); 
    set.add("May"); 
    set.add("June"); 


    Iterator <String>it=set.iterator(); 
    while(it.hasNext()){ 
     System.out.println(it.next()); 
    } 

我得到這樣的結果

June 
October 
December 
September 
May 
March 
Novermber 
July 
January 
February 
April 
August 

,這是什麼訂單或輸出的解釋?

+2

不保證它們按插入順序排列並說它們是隨機排列的。 [正如文檔說的](https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html):「*它不保證集合的迭代順序*」 。 –

+0

順便說一句,關於你重新哈希的問題:它不是重複的,這是一個完全合法的問題。但是有很多基於散列的地圖,它們的行爲非常不同。 – biziclop

回答

6

HashSet基於數組。陣列中的項目索引基於hashCode()函數計算。

HashSet中的迭代器在數組元素上移動,跳過空元素。這就是爲什麼你的訂單「很奇怪」。如果您需要保留廣告訂單,請使用LinkedHashSet

1

您必須支付訂購費用(大多數情況下以計算時間的形式)。並且documentation明確指出,即[...]。它對集合的迭代次序沒有任何保證;特別是,它不能保證訂單會隨着時間的推移保持不變。因此,我認爲爲了表現而不考慮訂單。