[英]Hashset printing the values in same order every time?
它不保證集合的迭代順序。 特別是,它不能保證訂單會隨着時間的推移保持恆定
代碼:-
Set<String> set = new HashSet<String>();
set.add("This is Tiger");
set.add("This is Cat");
set.add("This is Dog");
set.add("This is Elephant");
set.add("This is Parrot");
for(int i=0;i<100;i++){
for(String str:set){
System.out.println(str);
}
}
當我多次執行以上代碼時,我看到以下輸出
This is Elephant
This is Parrot
This is Cat
This is Dog
This is Tiger
我的問題是,當java docs說HashSet不能保證該命令隨時間推移保持恆定時,為什么我在執行該程序的任何時間都看到上述命令相同。
它基於字符串的哈希碼進行內部排序嗎?
更新:-根據答案,當設置為靜態時,順序似乎是可預測的。 當我說可預測的時候,這並不意味着檢索順序將與插入順序相同,但是無論第一次返回的順序是什么,隨着時間的推移都會相同。
理由:-假設我要添加5個靜態條目,則它將基於哈希碼將其存儲在存儲桶下(列表/數組中的任何位置都沒有)。 Let's Elephant適合放在第3桶以下,鸚鵡-5桶,貓-第6桶,狗-第9桶,老虎-第10桶
現在,如果我添加長頸鹿,它會根據哈希碼適合第8個存儲桶>現在,如果我進行迭代,它將對起始存儲桶中的條目進行迭代。 隨着時間的流逝,這將是恆定的。 因此,如果set為靜態,則順序是可以預測的。
我不會使用Hashset進行訂購,但是我有第三方代碼將靜態條目放在HashSet下,我無法更改。 由於某種原因,我需要預測這些條目中的順序
它不保證集合的迭代順序。 特別是,它不能保證訂單會隨着時間的推移保持恆定
碰巧您有一個靜態Set
。 當您使用新添加的內容修改現有Set
時,保證生效:
你是對的。 您的程序將按預期返回。
Set<String> set = new HashSet<String>();
set.add("This is Tiger");
set.add("This is Cat");
set.add("This is Dog");
set.add("This is Elephant");
set.add("This is Parrot");
/*
This is Elephant
This is Parrot
This is Cat
This is Dog
This is Tiger
*/
for (String str : set) {
System.out.println(str);
}
現在,讓我們添加一個新條目,例如Set
的長頸鹿。
Set<String> set2 = new HashSet<String>();
set.add("This is Tiger");
set.add("This is Cat");
set.add("This is Dog");
set.add("This is Elephant");
set.add("This is Parrot");
set.add("This is Giraffe");
/*
This is Elephant
This is Parrot
This is Cat
This is Giraffe
This is Dog
This is Tiger
*/
for (String str : set) {
System.out.println(str);
}
元素的順序已更改。
要記住的是,您不應該依賴集合的迭代順序,因為插入順序是不可預測的,與LinkedHashSet
類的可預測插入順序相反
除了對注釋和其他答案中涉及的保證的理解外,還有HashMap
的內置功能(即HashSet
),基於此功能,它對值的順序有很大影響:
實施說明。
該映射通常用作裝箱(存儲桶)的哈希表,但是當bin太大時,它們將轉換為TreeNode的bin,每個bin的結構都與java.util.TreeMap中的結構類似。 大多數方法嘗試使用普通的bin,但是在適用時中繼到TreeNode方法(只需通過檢查節點的instance)。 TreeNodes的bin可以像其他任何遍歷一樣使用,但在人口過多時還支持更快的查找。 但是,由於正常使用中的絕大多數垃圾箱並未人口過多,因此在使用表方法的過程中可能會延遲檢查是否存在樹木垃圾箱。
這實際上意味着,在一比特中包含一定數量的值之后, HashMap
會將存儲桶從類似鏈表的結構重構為類似樹形地圖的結構。 這將影響迭代中值的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.