簡體   English   中英

哈希集每次都以相同順序打印值嗎?

[英]Hashset printing the values in same order every time?

每個HashSet Java文檔

它不保證集合的迭代順序。 特別是,它不能保證訂單會隨着時間的推移保持恆定

代碼:-

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM