A collection that contains no duplicate elements
一個沒有重復元素的Collection
這個集合代表了數學上的集合. 也就是說
- 一個
Set
里只有一個null
; -
Set
里不會有出現兩個對象出現obj1.equals.(obj2)
在Collection的基礎上 , 集合在 addd
, equals
hashcode
還有所有的構造方法上添加了額外的規范(構造方法必須生成一個符合定義的Set對象,這不是廢話嗎?不過這個確實不是廢話,后面就知道了). 另外, Collection 中的其他方法, Set也顯式聲明了, 但并沒有給這些聲明的方法添加額外的約束,也就是說并沒有這些方法的意義和Collection的是相同的(僅僅是為了方便).
注意:
- 禁止向Set把自身作為元素添加進去. 例如 :
set.add(set)
- 當易變的對象作為Set的元素時,應該充分考慮是不是可行的.因為 當Set里的元素的值發生了改變,即使影響了其
equals
方法時,Set并不會做出反應.請看例子:
Set<DemoObj> set = new HashSet<>();
DemoObj demo1 = new DemoObj(1);
DemoObj demo2 = new DemoObj(2);
DemoObj demoCopy2 = new DemoObj(2);
set.add(demo1);
set.add(demo2);
set.add(demoCopy2);
System.out.println(set.size());//2
demo1.id = 2;
System.out.println(set.size());//2
這下就知道為什么那句話不是廢話了吧. 這個時候set里面的兩個元素demo1.equals(demo2);
一些Set的實現類約束其插入的元素的合法性, 比如不能為null
,類型檢查等等.. 如果插入一個非法的元素會拋出一個運行期異常, 查詢一個非法的元素可能會拋出異常也可能會直接返回false
int size();
返回這個Set中的元素個數, 如果元素個數大于Integer.MAX_VALUE 就返回Integer.MAX_VALUE;
boolean isEmpty();
返回這個Set的元素個數是不是0
boolean contains(Object o);
判斷Set是否含有對象o
Iterator<E> iterator();
返回一個非指定順序的迭代器
Object[] toArray();
返回一個含有Set中所有元素的數組.記住返回值不是E[]而是Object[].使用時需要強轉
<T> T[] toArray(T[] a);
返回一個數組b, 包含所有Set內的元素, b.length = max(a.length,set.size())
;
注意, 當a.length > set.size()時
b的前set.size個元素為set的元素, 其余為a數組中的后 a.length - set.size()
的元素. 也就是說, b為a的前set.size()
個元素被set的元素覆蓋后的結果.
boolean add(E e);
將一個元素e添加進set.
如果e已經存在set里, 會返回false;
如果e是一個非法的元素,會拋出一個運行期異常;
boolean remove(Object o);
移除set中的對象o.成功移除返回true
; 如果set中不含有元素e使得e.equals(o)
, 那么返回false
.
boolean containsAll(Collection<?> c);
相當于對參數c進行一個遍歷調用boolean contains(Object o);
boolean addAll(Collection<? extends E> c);
相當于對參數c進行一個遍歷調用boolean add(E e);
boolean retainAll(Collection<?> c);
保留Collection下的元素,移除其余元素
boolean removeAll(Collection<?> c);
相當于對參數c進行一個遍歷調用boolean remove(Object e);
void clear();
移除set中所有元素.
boolean equals(Object o);
判斷兩個集合包含的元素及其個數是否完全一致.
int hashCode();
返回Set中所有元素的hashCode總和.
default Spliterator<E> spliterator(){}
返回該set的并行迭代器Spliterator