簡體   English   中英

為什么此HashSet代碼段具有這種行為?

[英]Why does this HashSet code snippet behave this way?

給出以下代碼:

public class NewClass {

    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("Orange", "Pineapple", "Banana", "Banana");
        Set<String> fruitsSet = new HashSet<>();

        for (String fruit : fruits) {
            fruitsSet.add(fruit);
        }

        for (String fruit : fruitsSet) {
            System.out.println(fruit);
        }
    }
}

每次我運行代碼時,元素的順序都是相同的,消除了重復的項目Banana,這是HashSet實現的典型特征:

Banana
Pineapple
Orange

我的問題是,為什么每次的順序都一樣,因為規范說“它不能保證集合的迭代順序”( https://docs.oracle.com/javase/7/docs/api/ java / util / HashSet.html

“無保證”僅表示:無保證。 可能恰好是您每次將元素插入到集合中的順序。 可能是隨機順序。 除了滿月的星期二,所有時間的順序都可能完全相同。 “沒有保證”並不意味着“隨機”或“不可預測”,僅表示您不能依賴任何特定順序,因為它可能由於任何原因改變。

HashSet存儲元素的順序取決於每個元素的hashCode 因為每次您放置相同的String它們的hashCode也是相同的,順序也相同。

但是正如Louis Wasserman所說的那樣,您不應該依賴該順序,因為不能保證在新的JDK中不會更改該順序。

哈希集中的迭代順序由哈希函數轉換每個元素以創建其hashCode的方式確定。 因此,對於特定的字符串,您將獲得特定的hashCode,並將其放置在Set的特定單元格中。

沒有保證意味着添加Orange,Pineapple和Banana不會在迭代時保證該順序。

而且,它通過不承諾某些限制(例如排序)為HashSet的未來實現留出了空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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