Set接口
不包含重复元素的集合。 更正式地说,集合不包含一对元素e1.hash == e2.hash && e1.equals(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;
}