1. 介绍
TreeSet, LinkedHashSet and HashSet 在java中都是实现Set的数据结构
# TreeSet的主要功能用于排序
# LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出)
# HashSet只是通用的存储数据的集合
2. 相同点
1) Duplicates elements: 因为三者都实现Set interface,所以三者都不包含duplicate elements
2)Thread safety: 三者都不是线程安全的,如果要使用线程安全可以用 Collections.synchronizedSet()
3. 不同点
1)Performance and Speed: HashSet插入数据最快,其次LinkHashSet,最慢的是TreeSet因为内部实现排序
2)Ordering: HashSet不保证有序,LinkHashSet保证FIFO即按插入顺序排序,TreeSet安装内部实现排序,也可以自定义排序规则
3)null: HashSet和LinkHashSet允许存在null数据,但是TreeSet中插入null数据时会报NullPointerException
4. 代码比较
public class Test { public static void main(String args[]) { HashSet<String> hashSet = new HashSet<>(); LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(); TreeSet<String> treeSet = new TreeSet<>(); for (String data : Arrays.asList("B", "E", "D", "C", "A")) { hashSet.add(data); linkedHashSet.add(data); treeSet.add(data); } //不保证有序 System.out.println("Ordering in HashSet :" + hashSet); //FIFO保证安装插入顺序排序 System.err.println("Order of element in LinkedHashSet :" + linkedHashSet); //内部实现排序 System.out.println("Order of objects in TreeSet :" + treeSet); } }
output:
Order of element in LinkedHashSet :[B, E, D, C, A] Ordering in HashSet :[C, B, A, D, E] Order of objects in TreeSet :[A, B, C, D, E]