package java.util;
//提供一个Set实现的骨架,使得在实现Set接口时重复写很多相同的代码
//这些所谓相同的代码,就是作为一个所有Set应该具有的性质(或者说限制)和操作
//extends AbstractCollection<E>:
//Set作为一个Colletion,也应该具有一些Colletion应该具有的性质(或者说限制)和操作,也不用自己来写,直接继承,也是为了不重复写代码
//implements Set说明这个是个Set<E>,在一定意义上Set接口是个标记接口
//说实话,感觉有适配器的思想在里面,不管怎样,都可以作为向上转换为Colletion进行一些基本的操作(面对Colletion的操作,接口)
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {
//本Set是否包含参数的全部
//此处的containAll使用的就是AbstractCollection中的containAll方法
//看,一点重复的方法都不会写,这些属于Colletion性质的方法就放在AbstractCollection去实现,
//set是某种Colletion,所以直接继承AbstractCollection来获取这些作为Colletion的基本的性质(限制)和操作(就是这些方法的实现)
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
}
//Set的hash值就是把所有的元素(对象)的hash值相加,保证了相同的Set必须相同的hash值,但是反之不一定
//null的hash值为0
public int hashCode() {
int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
E obj = i.next();
if (obj != null)
h += obj.hashCode();
}
return h;
}
//从本Set中删除参数包含的所有元素(如果有的话)
public boolean removeAll(Collection<?> c) {
//标记是否修改了
boolean modified = false;
//用数量少的那一个来进行迭代比较!这样比较次数会比较少,节省时间
//很巧妙
if (size() > c.size()) {
for (Iterator<?> i = c.iterator(); i.hasNext(); )
//参数中的元素比较少,则参数中的所有元素调用remove进行查找,如果查找到并且删除,则 modified变为true
modified |= remove(i.next());
} else {
for (Iterator<?> i = iterator(); i.hasNext(); ) {
//本Set中的元素比较少,迭代本Set的元素,看是否包含在参数的元素中,如果是,则remove
if (c.contains(i.next())) {
i.remove();
modified = true;
}
}
}
return modified;
}
}
jdk源码分析之AbstractSet
最新推荐文章于 2023-01-30 12:25:39 发布