簡體   English   中英

Java HashSet以奇怪的順序顯示列表,始終以3開頭

[英]Java HashSet shows list in weird order, always starting with 3

我有一些字符串數組,實際上只有來自文件的整數列表。 我將其轉換為HashSet,以便刪除重復項,如下所示:

Set<String> intSet = new HashSet<String>(Arrays.asList(strArr));

我期望它的所有數字都是有序的但是當然,因為這是一個字符串而不是整數列表,它可能不按順序排列。 但每當我嘗試打印這個HashSet時,我總是得到如下輸出:

[3, 2, 1, 4]
[3, 2, 5, 4]

每次,如果存在3,則認為它是第一個元素。 我不知道為什么這樣做? 任何人都可以解釋我這個。

HashSet不維護可預測的順序,它將取決於對象引用的hashCode 如果要維護插入元素的順序,請使用LinkedHashSet 如果要保持元素始終排序,請使用TreeSet

返回的順序取決於內部哈希算法,您應該對此無動於衷。 (散列算法背后的想法是在內部表中統一分散鍵值。由於此算法可能具有確定性,因此每次可能會返回3個)。

如果你想要按照詞法順序返回,那就使用TreeSet。

要保留插入順序,請使用LinkedHashSet。

這是由於HashSet的實現。 如果您想要一個維持某個訂單的Set,您可以使用LinkedHashSet。

來自LinkedHashSet的javadoc:

此實現使其客戶端免受HashSet提供的未指定的,通常是混亂的排序,而不會導致與TreeSet相關的增加的成本。 無論原始集合的實現如何,它都可用於生成與原始集合具有相同順序的集合的副本:

從Oracle文檔中我們可以發現HashSet類實現了set接口並由Hash Table內部支持。它不保證集合的迭代順序; 特別是,它不保證訂單會隨着時間的推移保持不變。

因此,如果您關心元素的順序,我建議您使用TreeSet。

public static void main(String[] args){
        String version = System.getProperty("java.version");
        System.out.println("JDK version-"+version); 
        SortedSet<String> ss = new TreeSet<String>();
        ss.add("1");
        ss.add("3");
        ss.add("2");
        ss.add("4");
        System.out.println(ss);

    }

O / P:

JDK version-1.6.0
[1, 2, 3, 4]

暫無
暫無

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

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