默认设置是否排序?

时间:2011-10-07 09:27:53

标签: java

已更新

    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]

在我们添加时需要一些设置默认排序整数值的信息但如果我将字符串添加到设置它默认情况下不会排序。

更新 并且在运行多次后,Caps字母总是会被排序。

java版“1.6.0_26” Java(TM)SE运行时环境(版本1.6.0_26-b03) Java HotSpot(TM)客户端VM(版本20.1-b02,混合模式,共享)

请给我一些想法。 感谢

4 个答案:

答案 0 :(得分:3)

HashSet无法保证其内容将以任何方式排序。有一个特殊的接口可以提供这样的保证:它叫做SortedSet

  

A Set进一步提供其元素的总排序。该   元素按其自然顺序或Comparator排序   通常在排序集创建时提供。集合的迭代器   将按升序元素顺序遍历集合。还有几个   提供操作以利用订购。 (这个   interface是SortedMap的设定模拟。)

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

答案 1 :(得分:2)

不,HashSet 排序 - 或者至少,不可靠。您可能发生以在某些情况下获得订购,但您不得依赖它。例如,可能它将始终返回按“散列代码模数一些素数”排序的条目 - 但它不能保证,而且它几乎肯定没有用。

如果您需要排序集实现,请查看TreeSet

答案 2 :(得分:1)

从Oracle文档中我们可以发现HashSet类实现了set接口 并由Hash Table内部支持。它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。 但是,我发现的代码即使在运行了一段时间之后也会发现它已经排序了。

 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]

答案 3 :(得分:-1)

我建议您查看Set interface javaDoc。在所有已知的实现类部分中,您可以使用提供的实现,如果您检查HashSet,则第一个句子将回答您的问题。

顺便说一下。检查javaDoc总是一个好的起点; - )