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被排序。为什么这样?
答案 0 :(得分:7)
HashSet
绝对无法保证排序。订购不能保证完全。
来自iterator()
方法的文档:
返回此set中元素的迭代器。元素按特定顺序返回。
HashSet
旨在通过平等非常快速地插入和检查元素的存在。就是这样。
如果您需要排序,则应使用SortedSet
的实施,例如TreeSet
或ConcurrentSkipListSet
。
答案 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
保证订购和“没有重复的元素”。