1.概述
AbstractSet抽象类属于Set集合分支的顶层类。这个类中有且定义了三个方法
2.类图
它继承了AbstractCollection,实现了Set接口
一些集合的通用方法在这个类中并没有去重写。
3.基本方法
3.1删除集合中所有元素
public boolean removeAll(Collection<?> c) {//给定集合c
Objects.requireNonNull(c);
boolean modified = false;
if (size() > c.size()) {//若调用者的大小大于传入的集合参数
for (Iterator<?> i = c.iterator(); i.hasNext(); )//迭代参数集合c
modified |= remove(i.next());//从调用者集合中删去每一项(相同项chon)
} else {//若传入的参数集合大于调用者的集合
for (Iterator<?> i = iterator(); i.hasNext(); ) {//迭代调用者集合c
if (c.contains(i.next())) {//若集合c中包含某项
i.remove();//则该项从调用者集合中删去
modified = true;
}
}
}
return modified;
}
3.2 重写hashCode
public int hashCode() {//迭代集合中的每一项,每一项调用obj的hashCode计算 然后累加起来
int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
E obj = i.next();
if (obj != null)
h += obj.hashCode();
}
return h;
}
3.3 重写equals
public boolean equals(Object o) {
if (o == this)//若是本身则返回true
return true;
if (!(o instanceof Set))//若参数类型不是Set返回false
return false;
Collection<?> c = (Collection<?>) o;
if (c.size() != size())//若大小不同则返回false
return false;
try {
return containsAll(c);//判断调用者集合中是否全部包含c,其实也就是判断c中每一项是否都存在
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
}