Set接口介绍
文章目錄
- 前言
- 一、Set接口:
- 1.Set接口特點:
- 2.Set的實現類:
- Set接口提供的方法API:
- 二、HashSet
- 1.HashSet的特點:
- 2.HashSet的屬性:
- 3.HashSet的構造函數:
- 4.HashSet方法:
- 三、LinkedHashSet:
- 1.LinkedHashSet的特點:
- 2.LinkedHashSet的繼承關系和構造器:
- 3、LinkedHastSet的應用場景:
- 四、TreeSet
- 1.TreeSet的特點:
- 2.屬性:
- 3.構造器方法
- 總結
前言
Set接口是Collection接口的子類,其繼承了所有方法。那么他有什么獨特的特點呢,下來我們來研究一下Set接口以及她的實現類的特點
提示:以下是本篇文章正文內容,下面案例可供參考
一、Set接口:
1.Set接口特點:
數據是不能重復的、最多可以存儲一個null值
2.Set的實現類:
HashSet、LinkedHashSet和TreeSet
Set接口提供的方法API:
二、HashSet
1.HashSet的特點:
1、HashSet不能保證數據有序 2、HashSet數據是不能重復的 3、HashSet是可以存儲null值2.HashSet的屬性:
//map屬性是存儲數據的,是HashMap類型的數據 private transient HashMap<E,Object> map; //PRESENT屬性,HashMap中填充的value值 private static final Object PRESENT = new Object();3.HashSet的構造函數:
調用HashSet的構造函數發現其底層是實現了一個HashMap的
public HashSet() {map = new HashMap<>();}public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}4.HashSet方法:
public boolean add(E e) {return map.put(e, PRESENT)==null;}public boolean remove(Object o) {return map.remove(o)==PRESENT;}public void clear() {map.clear();}由上面的源碼我們可以發現HashSet底層實現是基于HashMap來實現的,將set中存儲的值作為HashMap的key來處理,PRESENT是一個填充的value值
三、LinkedHashSet:
1.LinkedHashSet的特點:
1、數據有序 2、數據不能重復 3、數據是可以存儲null的2.LinkedHashSet的繼承關系和構造器:
通過聲明形式可知:其繼承自HashSet,其繼承了HashSet中所有的屬性和方法
public class LinkedHashSet<E> extends HashSet<E>implements Set<E>, Cloneable, java.io.Serializable {public LinkedHashSet(int initialCapacity, float loadFactor) {super(initialCapacity, loadFactor, true);}public LinkedHashSet(int initialCapacity) {super(initialCapacity, .75f, true);}public LinkedHashSet() {super(16, .75f, true);}public LinkedHashSet(Collection<? extends E> c) {super(Math.max(2*c.size(), 11), .75f, true);addAll(c);} }通過聲明形式可知:其繼承自HashSet,其繼承了HashSet中所有的屬性和方法
構造函數調用父類HashSet中方法如下:
LinkedHashSet的實現是基于LinkedHashMap來實現的
LinkedHashSet數據有序的特征是基于LinkedHashMap來保證的,其底層利用雙向鏈表來實現的數據有序
3、LinkedHastSet的應用場景:
在去重的基礎上數據有序
四、TreeSet
1.TreeSet的特點:
1、數據自然有序(自定義排序,實現Comparator接口)
2、數據不能重復
3、數據不能為null
2.屬性:
//TreeSet實現類的一共父接口實例用來存儲數據private transient NavigableMap<E,Object> m;//PRESENT屬性,HashMap中填充的value值 private static final Object PRESENT = new Object();3.構造器方法
通過源碼可知:TreeSet底層是基于treeMap來實現的
TreeSet(NavigableMap<E,Object> m) {this.m = m;}public TreeSet() {this(new TreeMap<>());}public TreeSet(Comparator<? super E> comparator) {this(new TreeMap<>(comparator));}public TreeSet(Collection<? extends E> c) {this();addAll(c);}public TreeSet(SortedSet<E> s) {this(s.comparator());addAll(s);}總結
當我們學習完Set的接口和他的實現類以后發現他們的實現都是基于對應Map的來實現,他的存在是為了我們只需要進行對單一數據操作來保證數據不重復等特點的使用的。
總結
- 上一篇: WeakHashMap和四种引用总结:
- 下一篇: Queue接口及是实现类Priority