## **什么是Set数据结构**
* Set相对于List是简单的⼀种集合,具有和 Collection 完全⼀样的接⼝,只是实现上不同,Set 不保存重复的元素,存储⼀组唯⼀,⽆序的对象;
* Set中的元素是不能重复的, 实现细节可以参考Map,因为这些Set的实现都是对应的Map的⼀ 种封装。⽐如HashSet是对HashMap的封装,TreeSet对应TreeMap;
* Set底层是⼀个HashMap,由于HashMap的put()⽅法是⼀个键值对,当新放⼊HashMap的 Entry中key 与集合中原有Entry的key相同(hashCode()返回值相等,通过equals⽐较也返回 true),新添加的Entry的value会将覆盖原来Entry的value,但key不会有任何改变;
* 允许包含值为null的元素,但最多只能有⼀个null元素
## **常⻅的实现类**
1. HashSet
* HashSet类按照哈希算法来存取集合中的对象,存取速度⽐较快
* 对应的Map是HashMap,是基于Hash的快速元素插⼊,元素⽆顺序。
2. TreeSet
* TreeSet类实现了SortedSet接⼝,能够对集合中的对象进⾏排序
## **代码解读**
~~~
import java.util.HashSet;
import java.util.TreeSet;
public class SetLearn {
public static void setTest(){
HashSet<String> set = new HashSet <>();
TreeSet<String> treeSet = new TreeSet<>();
/**
* 点进去下面的add看看 HashSet.add 的方法
* public boolean add(E e) {
* return map.put(e, PRESENT)==null;
* }
* 其中 : private static final Object PRESENT = new Object();
* 所以可以说,Set是Map的一种实现,add的过程其实是将需要保存的数据存在了map的key中
* 也预示着,Set中存储的值是唯一的
*
* 同样的:
* HashSet的速度快,但是没有顺序
* TreeSet的速度慢,但是会排序
*/
set.add("test1");
treeSet.add("treeSetTest1");
/**
* 其中的方法和list一样
*/
set.size();
set.isEmpty();
set.clear();
}
}
~~~