是否默认按顺序排序?

6

更新:

    Set s = new HashSet();
    s.add(1);
    s.add(5);
    s.add(4);
    s.add(9);
    s.add(7);
    s.add(8);        
    s.add("b");
    s.add("a");
    s.add("B");
    s.add("A");
    s.add("s");
    s.add("x");        
    s.add("d");        
    System.out.println(s);
    s.remove("b");
    s.remove("d");
    System.out.println(s);

输出:

[1, d, 4, b, 5, A, B, 7, a, 8, 9, s, x]
[1, 4, 5, A, B, 7, a, 8, 9, s, x]
[1, 4, 5, A, B, 7, a, 8, 9, s, x]

需要一些关于设置默认排序整数值的信息,当我们添加整数时默认进行排序,但如果我添加字符串到集合中,则不会按默认方式排序。
更新: 并且大写字母始终在运行多次后排序。
Java版本"1.6.0_26" Java(TM) SE Runtime Environment(build 1.6.0_26-b03) Java HotSpot(TM) Client VM(build 20.1-b02,mixed mode,sharing)
请给我一些思路。 谢谢。
4个回答

4

HashSet 不保证其内容以任何方式排序。对于提供此类保证的 set,有一个特殊的接口:它称为SortedSet

一个在其元素上进一步提供总排序的 Set。元素使用它们的自然排序或通常在创建排序集时提供的 Comparator 进行排序。集合的迭代器将按升序遍历集合。提供了几个附加操作以利用排序。(此接口是 SortedMap 的 set 类似物。)

在 Java 6 中,有两个实现此接口的类:ConcurrentSkipListSetTreeSet


3
不,HashSet 不是有序的 - 或者至少不可靠。在某些情况下,你可能会得到排序,但你不能依赖它。例如,它可能总是返回按“哈希码模一些质数”排序的条目 - 但这不是保证的,而且几乎肯定没有用处。如果你需要一个已排序集合的实现,请看 TreeSet

的确,如果你的哈希表被重新调整大小,顺序就会完全改变。 :-) - C. K. Young
谢谢,@ChrisJester-Young:我通过删除“b”、“d”来调整大小,但输出将保持不变。 - Ravi Parekh
1
@Ravi:我所说的重新调整哈希表大小不是这个意思。请尝试插入足够的项以超过哈希映射的负载因子并查看发生了什么。 - C. K. Young

1
从Oracle文档中我们可以发现HashSet类实现了set接口,并且内部由哈希表支持。它不能保证集合的迭代顺序;特别地,它不能保证顺序会随时间保持不变。但是下面给出的代码在运行多次后仍然按顺序排列。
 public static void main(String[] args){
        Random rand = new Random(47);           
        SortedSet<Integer> intset = new TreeSet<Integer>();
        Set<Integer> intsetUnsorted = new HashSet<Integer>();
        for(int i=0;i<10000;i++){
            intset.add(rand.nextInt(30));
        }
        intsetUnsorted.add(500);
        for(int i=0;i<10000;i++){
            intsetUnsorted.add(rand.nextInt(30));
        }
        String version = System.getProperty("java.version");
        System.out.println("JDK version-"+version);     
        System.out.println("TreeSet o/p");
        System.out.println(intset);
        System.out.println("Hash Set o/p");
        System.out.println(intsetUnsorted);

    }  

O/P

JDK version-1.6.0
TreeSet o/p
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
Hash Set o/p
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 16, 19, 18, 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 500]

-1
我建议您查看Set interface javaDoc。在所有已知实现类部分,您可以找到提供的实现,如果您检查HashSet,则第一句话就回答了您的问题。
顺便说一下,查看javaDoc始终是一个很好的开始;-)

Java文档中说:“它不能保证集合的迭代顺序;特别是,它不能保证顺序会随时间保持不变。该类允许空元素...”,我认为(如果我错了请纠正)它谈论的是插入顺序而非排序顺序。 - aName
它讲述了对元素进行迭代的内容。例如,当您打印它们时,您会对它们进行迭代。不确定您所说的“排序顺序”是什么意思。 - Jan Zyka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接