[英]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.