您的位置:首页 > 编程语言 > Java开发

Java基础之有容乃大篇(AbstractSet)

2018-03-28 21:18 218 查看

AbstractSet

  它继承了AbstractCollection,实现了Set接口,先回顾一下Set接口,Set接口继承了Collection并没有进行扩展,AbstractCollection实现了Collection接口部分方法。AbstractSet除了继承自AbstractCollection的方法之外,都实现了哪些方法呢?
    源码之中AbstractSet代码很少,实现了removeAll方法,重写了equals和HashCode方法。

    实现的removeAll方法
public boolean removeAll(Collection<?> c) {
Objects.requireNonNull(c);    //下次再遇到要判断对象是否为空,空的时候报空指针异常的时候就可以使用这个方法。
boolean modified = false;

if (size() > c.size()) {    //如果当前Set的元素数量大于指定集合
for (Iterator<?> i = c.iterator(); i.hasNext(); )//迭代指定集合中的元素全部移除
modified |= remove(i.next());
} else {
for (Iterator<?> i = iterator(); i.hasNext(); ) {//小于指定集合就遍历当前的Set
if (c.contains(i.next())) {        //在指定集合c中看是否包含当前元素
i.remove();            //包含就移除
modified = true;
}
}
}
return modified;
}    重写的equals和hashCode方法源码实现: 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);    //当前集合是否包含待比较的对象集合,包含就返回ture不包含就返回false
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
}
public int hashCode() {
int h = 0;                    //它的hashCode算法是把所有的元素的hashCode值相加 返回
Iterator<E> i = iterator();
while (i.hasNext()) {
E obj = i.next();        
if (obj != null)
h += obj.hashCode();
}
return h;
}                                    //具体为什么重写equals就要重写HashCode,在写AbstractList那篇文章中有讲
                                        //这里再次提一嘴:  原因有二,
                                            1.如果我们使用的集合需要用到hash算法,那就必须重写
                                            2.Java规范的约定是,在集合类中使用自定义类型需要重写这两个方法。
                                        //这里有大神博客的链接:https://blog.csdn.net/world6/article/details/70053356
                                        //博客叙述的是HashMap的一些知识梳理和值得注意的点,其中有为什么重写这两个方法的原因,还不错
    Objects.requireNonNull方法解读:
        这个方法是Objects类中的方法,源码如下,当参数object为空的时候,会抛出空指针异常。
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}

总结

    其实关于abstratSet抽象类、还有这些集合的接口啊,没有什么可以叙述的,具体为什么这么设计,说白了就是面向对向设计,OOD,用面向对象的思维来看待JDK中的源码,设计无非就是使用 抽象、 封装、 继承、 多态这四个特性去做事情,我们学习的23种java设计模式也无非就是抽象封装继承多态这四个特性的实现方式。我们把整个集合的框架用接口和抽象类分出层次,一方面是便于开发和理解。另一方面也便于我们扩展自己想要实现的东西,也避免了我们去实现一些不必要的东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  AbstractSet java容器