2014-07-08 52 views
3

,這是我的代碼在一個鍛鍊,JAVA HashSet的訂單

public class RockTest { 
public static void main(String[] args){ 
    HashSet<Rock> hashset = new HashSet(); 
    Rock rock1 = new Rock("QingDanasty",89); 
    Rock rock2 = new Rock("Modern",32); 
    Rock rock3 = new Rock("MingDanasty",100); 

    hashset.add(rock1); 
    hashset.add(rock2); 
    hashset.add(rock3); 

    Iterator<Rock> iterator = hashset.iterator(); 
    while(iterator.hasNext()){ 
     System.out.println(iterator.next().getName()); 
    } 
} 
} 

當代碼被打印,控制檯顯示ROCK2 ROCK1的順序rock3代替ROCK1 ROCK2和rock3,但是,我不知道爲什麼?

+1

HashSet順序(如果你想調用它)基於hashCode。所以,基於對象的HashCode,決定排序。 – TheLostMind

+0

3複製問題投票,4回答已經回答的重複問題。有趣的:) –

回答

2

HashSet不是OrderedSet,例如TreeSet,因此您無法對訂單作出任何假設。

0

正如其他答案已經指出,這是因爲你正在使用Set來存儲你的對象(特別是在你的情況下,一個HashSet)。 Sets不保證添加到它們的項目的順序,這就是爲什麼你看到它們以不同的順序打印出來,以便如何添加它們。如果您想維護添加到集合中的元素的順序,那麼您可能需要使用列表,例如LinkedListArrayList

我不會僅僅離開你,我會指出你在Java trail這個語言的不同集合類型的方向。這些線索將幫助您理解何時使用Java提供的不同類型的Collection實現,以及每種集合類型的特性。

0

對於HashSet,迭代順序基於每個元素的hashCode,它或多或少是「隨機的」(儘管對於某些類的實例而言是決定因素)。

要使迭代順序符合插入順序,使用一個LinkedHashSet其迭代順序是一樣的插入順序,或諸如TreeSetSortedSet一實現中,基於它們的天然順序(如果它們inplement可比),其排序其元素或使用提供的比較器。