HashSet不保证排序?

时间:2011-01-14 06:21:27

标签: java

import java.util.*;
public class DuplicateCheckMain {
 public static void main(String[] gopal){
  Integer[] args = {6,9,2,55,100,1,6,8,9};
  Integer[] args1 = {3,6,2,3,5};
  Set S = new HashSet();
  DuplicateCheck.checkDuplicate(S,args,new String("HashSet"));
  Set S1 = new HashSet();
  DuplicateCheck.checkDuplicate(S1,args1,new String("HashSet"));

  S = new TreeSet();
  DuplicateCheck.checkDuplicate(S,args,new String("TreeSet"));

  S = new LinkedHashSet();
  DuplicateCheck.checkDuplicate(S,args,new String("LinkedHashSet"));

 }
}

public class DuplicateCheck {

 public static void checkDuplicate(Set S, Integer[] args, String setname){
  for(int i = 0;i<args.length;i++){
   if(!S.add(args[i])){System.out.println("Duplicate element "+args[i]);}
  }
  System.out.println(S +" "+ setname);
 }
}

问题:对于带参考S的HashSet,HashSet未排序。但是对于参考S1,HashSet被排序。为什么这样?

5 个答案:

答案 0 :(得分:7)

HashSet 绝对无法保证排序。订购不能保证完全

来自iterator()方法的文档:

  

返回此set中元素的迭代器。元素按特定顺序返回。

HashSet旨在通过平等非常快速地插入和检查元素的存在。就是这样。

如果您需要排序,则应使用SortedSet的实施,例如TreeSetConcurrentSkipListSet

答案 1 :(得分:3)

HashSet使用mod将数字存储到存储桶条目

args1数组中,所有数字都小于16 - 默认的HashSet大小。这就是它最终被分类的原因。

答案 2 :(得分:3)

请注意,除了不保证排序外,如果插入新元素,HashSet的迭代顺序可能会完全改变。例如:

public class TestHashSet {
    public static void main(String[] foo) {
        Set<Integer> set = new HashSet<Integer>();
        set.addAll(Arrays.asList(new Integer[] {6,9,2,55,100,1,6,8,9}));
        System.out.println(set);
        set.addAll(Arrays.asList(new Integer[] {7,3,13,37,66}));
        System.out.println(set);
        set.add(42);
        System.out.println(set);
    }
}

给我以下输出:

[1, 100, 2, 55, 6, 8, 9]
[1, 100, 2, 3, 55, 66, 6, 37, 7, 8, 9, 13]
[1, 2, 100, 3, 6, 66, 7, 37, 8, 42, 9, 13, 55]

注意单个元素的插入如何完全改变了顺序。

答案 3 :(得分:0)

HashSet不保证排序。要使用排序功能,请使用TreeSet或类似的东西。

答案 4 :(得分:0)

java.util.Set保证“没有重复的元素”。

java.util.SortedSet保证订购和“没有重复的元素”。