Set
Set存储的是不重复的元素集合。Set和Map类似,Map有HashMap/LinkedHashMap/TreeMap,Set有HashSet/LinkedHashSet/TreeSet。对应的功能基本类似(可以对照Map的介绍文章看)。
源码上,Set内部是由对应的Map来实现的。
HashSet
HashSet存储的顺序是无序的。
System.out.println("HashSet");
HashSet<String> hashSet = new HashSet<String>();
hashSet.add("hello");
hashSet.add("hello");
hashSet.add("你好");
hashSet.add("hola");
for(String i : hashSet) {
System.out.println(i);
}
输出:
HashSet
你好
hello
hola
可以看到,重复元素会自动去重,且输出顺序和输入的顺序不一致。如何能够一致呢?需要用到下面的LinkedHashSet。
LinkedHashSet
LinkedHashSet存储的顺序是有序的,解决了HashSet无序的问题。
System.out.println("LinkedHashSet");
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<String>();
linkedHashSet.add("hello");
linkedHashSet.add("hello");
linkedHashSet.add("你好");
linkedHashSet.add("hola");
for(String i : linkedHashSet) {
System.out.println(i);
}
输出:
LinkedHashSet
hello
你好
hola
TreeSet
TreeSet实现了元素的排序,内部通过红黑树实现。
System.out.println("TreeSet");
TreeSet<String> treeSet = new TreeSet<String>();
treeSet.add("hello");
treeSet.add("hello");
treeSet.add("你好");
treeSet.add("hola");
for(String i : treeSet) {
System.out.println(i);
}
TreeSet
hello
hola
你好
可以看到内部实现了输出按照键的字典序从小大到排序。
总结
- Set是存储不重复元素集合的数据结构;
- HashSet是Set的简单实现,不过存储的是无序的;
- LinkedHashSet存储的是有序的;
- TreeSet实现了按照元素排序。