Set接口
不包含重複元素的集合。 更正式地說,集合不包含一對元素e1
和e2
,使得e1.equals(e2)
,並且最多一個空元素
類聲明
public interface Set<E> extends Collection<E>
和Collection接口的方法一致,通過 equal()
和 hashCode()
排重
AbstractSet抽象類
類聲明
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E>
構造函數
protected AbstractSet() {}
Set 方法實現
// 在此set集合中刪除指定集合中的所有元素
public boolean removeAll(Collection<?> c) {
Objects.requireNonNull(c);
boolean modified = false;
// 如果set集合大小大於指定集合,則迭代指定集合的元素進行刪除
if (size() > c.size()) {
for (Iterator<?> i = c.iterator(); i.hasNext(); )
// 只要成功刪除了一個元素則返回true
modified |= remove(i.next());
} else {
// 如果set集合大小小於等於指定集合,則迭代set集合中的元素進行刪除
for (Iterator<?> i = iterator(); i.hasNext(); ) {
if (c.contains(i.next())) {
// 只要成功刪除了一個元素則返回true
i.remove();
modified = true;
}
}
}
return modified;
}
Collection 方法實現
// 比較指定元素與此set的相等性
public boolean equals(Object o) {
if (o == this)
return true;
// 如果指定元素不是Set類型則返回false
if (!(o instanceof Set))
return false;
Collection<?> c = (Collection<?>) o;
// 如果兩個set集合大小不相等則返回false
if (c.size() != size())
return false;
try {
// 如果set包含指定set中的所有元素則返回true
return containsAll(c);
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
}
// 返回set的哈希碼值,即set中所有元素的哈希值和
public int hashCode() {
int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
E obj = i.next();
// null值不計算
if (obj != null)
h += obj.hashCode();
}
return h;
}