首页 文章

默认设置是否排序?

提问于
浏览
3

UPDATED

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]

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

Update: 并且在运行多次后总是将Caps字母排序 .

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

请给我一些想法 . 谢谢

4 回答

  • 2

    HashSet 不保证其内容将以任何方式排序 . 有一个特殊的接口可以提供这样的保证:它被称为SortedSet

    一个进一步提供其元素总排序的集合 . 元素按照它们的自然顺序排序,或者通过通常在排序集创建时提供的比较器排序 . set的迭代器将按升序元素顺序遍历集合 . 提供了几个额外的操作以利用订购 . (此接口是SortedMap的集合模拟 . )

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

  • 3

    不, HashSet 没有排序 - 或者至少,不可靠 . 您可能碰巧在某些情况下订购,但您不能依赖它 . 例如,它可能总是返回按"hash code modulo some prime"排序的条目 - 但它无论如何都几乎肯定没有用 .

    如果需要有序集实现,请查看TreeSet .

  • -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]
    
  • 1

    我建议你查一下Set interface javaDoc . 在 All Known Implementing Classes 部分中,您有所提供的实现,如果您检查HashSet,则第一个句子回答您的问题 .

    顺便说一句 . 检查javaDoc总是一个好的开始;-)

相关问题