簡體   English   中英

Java hashset和treeset

[英]Java hashset and treeset

我有個問題。 它說java中的hashset並不是一個訂單,而是查看我的程序

public static void main(String[] args) {
    HashSet<Integer> io=new HashSet<Integer>();

    Integer io1=new Integer(4);
    Integer io2=new Integer(5);
    Integer io3=new Integer(6);

    io.add(io2);
    io.add(io3);
    io.add(io1);

    System.out.println(io);
}

並執行它,每次我運行它給我一個有序集。 為什么會這樣?

另一個問題是:如果我實現了一個樹集(就像我在之前的程序中所做的那樣,而不是使用treeset和使用我的類的Integer intead的hashset)我必須實現compareto?

根據oracle docs ,無法保證您將始終獲得相同的訂單。

此類實現Set接口,由哈希表(實際上是HashMap實例)支持。 它不能保證集合的迭代順序; 特別是,它不保證訂單會隨着時間的推移保持不變。

HashSet不維護順序,但在打印時必須按某種順序迭代元素。 HashSetHashMap支持, HashMap按照存儲它們的bin的順序迭代元素。 在您的簡單示例中,4,5,6被映射到bin 4,5,6(因為整數的hashCode是整數的值)所以它們以升序打印。

如果您嘗試添加40,50,60,您會看到不同的順序( [50, 40, 60] 50,40,60 [50, 40, 60] ),因為默認的初始數量為16,因此哈希碼40,50,60將映射到容器40%16(8),50%16(2),60%16(12),因此50是第一個迭代的元素,接着是50和60。

對於TreeSet<SomeCostumClass> ,您可以在SomeCostumClass實現Comparable<SomeCostumClass> ,或者將Comparator<SomeCostumClass>傳遞給構造函數。

HashSet保留內部哈希表( https://en.wikipedia.org/wiki/Hash_table ),該表由相應對象hashCode()的結果驅動。 對於大多數對象, hashCode()函數是確定性的,因此迭代相同元素的HashSet的結果可能是相同的。 這並不意味着它會被訂購。 但是,對於Integer ,函數的hashCode()返回非常整數本身,因此,對於單級散列表,它將被排序。

暫無
暫無

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

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