AbstractSet源码分析-java8

1.3个方法
2.Hash值

hash=sum(每个元素的hash值)
如果元素为null,则默认hash值为0.

3.removeAll(Collection
4.源码分析
    package sourcecode.analysis;

    /**
     * @Author: cxh
     * @CreateTime: 18/3/21 20:42
     * @ProjectName: JavaBaseTest
     */

    import java.util.*;

    /**
     * AbstractSet是set接口的骨架实现,它减少了实现set接口的最少操作.
     *
     * 通过扩展此类来实现集合的过程与通过扩展AbstractCollection来实现集合的过程相同,
     * 不同之处在于此类的所有子类中的所有方法和构造函数都必须遵守由 Set接口 强加的额外约束。
     * (例如,add方法不允许将一个对象的多个实例添加到集合中)
     *
     * 注意:AbstractSet并没有覆盖任何AbastractCollection类.
     * 它仅仅添加了equals()和hashcode()方法.
     *
     * AbstractSet是java集合框架中的一员.
     *
     * @since 1.2
     */

    public abstract class AbstractSet<E> extends AbstractCollection<E> implements java.util.Set<E> {

        //唯一构造器方法,目的是为了子类对其调用.
        protected AbstractSet() {
        }

        /*-------比较和hash相关的方法--------*/


        //常见的equals执行步骤
        public boolean equals(Object o) {
            //o是否为当前对象
            if (o == this)
                return true;

            //类型是否为set
            if (!(o instanceof java.util.Set))
                return false;
            //强制转化
            Collection<?> c = (Collection<?>) o;
            //比较size
            if (c.size() != size())
                return false;
            try {
                //调用AbstractCollection的方法
                return containsAll(c);
            } catch (ClassCastException unused)   {
                return false;
            } catch (NullPointerException unused) {
                return false;
            }
        }

        //hash值=sum(所有元素的hash值)
        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;
        }

        //
        public boolean removeAll(Collection<?> c) {
            //c不能为空
            Objects.requireNonNull(c);

            //set结构更改标志位:初始化为false
            boolean modified = false;

            //如果set的大小>参数集合c的大小
            if (size() > c.size()) {
                //迭代删除,并更新modified标志位
                for (Iterator<?> i = c.iterator(); i.hasNext(); )
                    modified |= remove(i.next());
            } else {
                //如果set的大小<参数集合c的大小,则set进行迭代
                for (Iterator<?> i = iterator(); i.hasNext(); ) {
                    if (c.contains(i.next())) {
                        //删除上一次迭代访问的元素,达到删除目的
                        i.remove();
                        //更改修改标志位modified
                        modified = true;
                    }
                }
            }
            return modified;
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值