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设计模式也无非就是抽象封装继承多态这四个特性的实现方式。我们把整个集合的框架用接口和抽象类分出层次,一方面是便于开发和理解。另一方面也便于我们扩展自己想要实现的东西,也避免了我们去实现一些不必要的东西。
相关文章推荐
- Java基础之有容乃大篇(HashMap)
- Java基础之有容乃大篇(容器篇 - 继承关系)
- Java基础之有容乃大篇(详解LinkedList)
- Java基础之有容乃大篇(详解ArrayList)
- Java集合源码学习(9)_Set接口的基础实现AbstractSet
- Java基础学习总结(38)——Lombok的使用和原理
- 学习Spring必学的Java基础知识(1)----反射
- 黑马程序员Java培训、Android培训_Java 学习过程记录_语言基础2
- Java语言程序设计-进阶篇(五)算法基础
- java基础汇总(三)
- Java基础笔记-第十五记
- java基础学习之Layout
- Java基础零碎知识
- Java基础(集合卷)--List
- Day24第二十四天 java基础 -------网络编程 和正则表达式
- Java基础3
- Java进阶(三十三)java基础-filter
- Java Servelet API入门基础教程
- 零基础小白JAVA学习笔记(九)
- java基础知识学习之代理深入学习(用动态代理实现AOP,FacotryBean)