## **什么是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();
}
}
~~~