Set是Collection的子接口,HashSet是Set的实现类,SortedSet是Set的子接口,TreeSet是SortedSet的实现类。
这些集合共同的特点都是:无序、不可重复。
方法也与Collection相差无几。
1.Set
Set是一个接口,不能直接实例化对象,要借助其实现子类。
package com.dh.set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Set01 {
public static void main(String[] args) {
//Set是接口,借助HashSet实现类
Set<String> set = new HashSet<>();
set.add("a");
set.add("a");//可以添加重复元素,但是只会存储一个
//遍历元素也只有两种方法
//1.for增强
System.out.println("for增强遍历:");
for (String s : set) {
System.out.println(s);
}
//2.迭代器
System.out.println("迭代器遍历:");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
结果:只输出了一个a
for增强遍历:
a
迭代器遍历:
a
2.HashSet
HashSet底层为哈希表。存储在HashSet中的元素实际存放到了HashMap集合的key上。
源码:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
所以将重点放在HashMap集合上,只要搞懂了HashMap,HashSet也就理解了。
下一篇文章将会介绍。
3.TreeSet
TreeSet的底层为二叉树。存储在TreeSet上的元素实际存储在HashMap的key上。
添加到TreeSet中的元素会自动按照从小到大的顺序排序。
这里要注意排序和元素有序的区别:排序是按照一定的排序规则组织元素的顺序,而有序的意思是元素可以通过下标来操作,以及输出元素顺序与添加元素顺序一致。
例:
package com.dh.set;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSet01 {
public static void main(String[] args) {
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(1);
treeSet.add(3);
treeSet.add(2);
for (Integer integer : treeSet) {
System.out.println(integer);
}
//字符串会按照字典顺序逐个字母进行比较
TreeSet<String> treeSet1 = new TreeSet<>();
treeSet1.add("world");
treeSet1.add("hello");
Iterator<String> iterator = treeSet1.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
结果:
1
2
3
hello
world
以上内容还涉及到:
-
哈希表和二叉树的结构;
-
这些集合如何判断新添加的元素是否是已经存在的元素;
-
如何自定义比较规则。
这些问题都会在相关的Map集合中详细的介绍。即下一篇文章~