神图镇楼
1.HashSet
内部由哈希表实现,HashSet中的数据是无序的(说是无序,其实只是对coder而言,底层还是有一套算法实现排序的),可以放入null,存储对象不重复。
public static void main(String[] args) {
Set<Object> hashSet = new HashSet<Object>();
hashSet.add(1);
hashSet.add(null);
hashSet.add(1);
hashSet.add(4);
hashSet.add("5");
hashSet.add("0");
System.out.println(hashSet);
}
输出结果:[null, 0, 1, 4, 5]
2.TreeSet
内部由二差树(红黑树的数据结构)实现,TreeSet中的数据是自动排好序的,不允许放入null值,由于需要排序比较,所以元素必须是同一类型的(其实也解释了为何不能放入null),并且存储对象不重复。
public static void main(String[] args) {
Set<Object> treeSet = new TreeSet<Object>();
treeSet.add(1);
treeSet.add(1);
treeSet.add(4);
treeSet.add(5);
treeSet.add(0);
System.out.println(treeSet);
}
输出结果:[0, 1, 4, 5]
当放入null时:java.lang.NullPointerException
当放入不同类型对象时:java.lang.ClassCastException
3.LinkedHashSet
内部使用链接表维护元素次序(插入顺序),可以放入null,存储对象不重复。
public static void main(String[] args) {
Set<Object> linkedHashSet = new LinkedHashSet<Object>();
linkedHashSet.add(1);
linkedHashSet.add(null);
linkedHashSet.add(1);
linkedHashSet.add("");
System.out.println(linkedHashSet);
}
输出结果:[1, null, ]
总结:
当你想要强行给插入的元素维护一个想要的顺序时,应该使用TreeSet(实现Comparable接口并重写compareTo方法);当你想要元素顺序与插入顺序一致时,应该使用LinkedHashSet;其它情况应该使用HashSet,因为它的性能最优。