Set介面
set介面的特點:
- 不允許出現重複的元素
- 集合中的元素位置無順序
- 有且只有一個值為null的元素
因為set是一個抽象的介面,所以不能直接例項化一個set物件。(Set s = new Set()是錯誤的)
Set介面的兩大實現:HashSet、TreeSet
常用方法:
- add():向集合新增元素
- clear():清除集合中所有元素
- contains():判斷集合是否包括某一元素
- isEmpty():判斷集合是否為空
- iterator():用於遍歷集合
- remove():從集合中去掉特定的物件
- size():返回集合的大小
HashSet
HashSet是基於HashMap來實現的,使用了HashMap的key來實現各種特性,而HashMap的value始終是PRESENT。
HashSet儲存元素的順序並不是按照存入時的順序,是按照雜湊值來存的,所以取資料也是按照雜湊值取的。
構造方法
//構造一個新的空Set,底層是HashMap
public HashSet() {
map = new HashMap<>();
}
//構造一個包含指定collection中的所有元素的新Set
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
//構造一個新的空Set,其底層的HashMap例項具有指定的初始容量和預設的載入因子
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
//構造一個新的空Set,其底層的HashMap例項具有指定的初始容量和指定的載入因子
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}複製程式碼
HashSet是如何判斷兩個元素重複:
通過hashCode()方法和equals方法來保證元素的唯一性,add方法返回boolean型別。
判斷兩個元素是否相同,先判斷元素的hashCode值是否一致。如果一致,就會呼叫equals方法。如果equals返回true,HashSet就視為同一元素;返回false,則不是同一元素。
HashSet和ArrayList集合都有判斷是否有相同元素的方法。
//HashSet,底層用hashCode和equals方法判斷
public boolean contains(Object o) {
return map.containsKey(o);
}
//ArrayList的contains方法,底層用equals方法判斷
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
複製程式碼
TreeSet
TreeSet是一個有序集合,可以按任何順序將元素插入該集合,當對該集合進行迭代時,元素按照升序排序。
TreeSet的底層使用的是TreeMap,TreeMap的底層實現是紅黑樹。
構造方法:
public TreeSet() {
this(new TreeMap<E,Object>());
}
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);
}複製程式碼
參考資料: