Java集合之Set —— HashSet、TreeSet及LinkedHashSet

神图镇楼

Java集合之Set —— HashSet、TreeSet及LinkedHashSet

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,应为它的性能最优。