java.util.AbstractSet学习笔记

概述


继承结构


这里写图片描述


类介绍


AbstractSet提供了对java.util.Set接口的基础实现。通过继承本类实现一个Set与通过继承java.util. AbstractCollection的形式基本相同,除了本接口实现类中的所有方法都需要保证Set接口中对于一个数学集合的限制条件。本类中并没有重写由AbstractCollection继承而来的方法,但是增加了equalshashCode方法的实现。


方法介绍


 public boolean equals(Object o) {
    if (o == this)
        return true;

    if (!(o instanceof Set))
        return false;
    Collection<?> c = (Collection<?>) o;
    if (c.size() != size())
        return false;
    try {
        return containsAll(c);
    } catch (ClassCastException unused)   {
        return false;
    } catch (NullPointerException unused) {
        return false;
    }
}

重写java.lang.Object中提供的默认的equals(o)方法,通过本方法,顺便看一下判断对象是否相等的流程:

  1. 首先判断两个对象是不是同一块内存的引用,如果为同一引用,直接返回true;
  2. 判断两个对象是不是同一种类型,如果不是同一种类型,则返回false;
  3. 判断两个集合中的元素个数是否相等,如果不相等,直接返回false;
  4. 判断被检测集合中是否包含检测集合中所有的元素,如果是,返回true,否则返回false。(要注意集合中元素之间的类型转换)。
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类型的哈希值。对于一个Set的对象而言,其哈希值为其中包含的所有元素的哈希值的和,对于null元素,认为其哈希值为0。其保证了Object.hashCode中对于相等对象的要求,即:如果两个对象s1s2,如果有s1.equals(s2),那么一定有:s1.hashCode()==s2.hashCode()

public boolean removeAll(Collection<?> c) {
    Objects.requireNonNull(c);
    boolean modified = false;

    if (size() > c.size()) {
        for (Iterator<?> i = c.iterator(); i.hasNext(); )
            modified |= remove(i.next());
    } else {
        for (Iterator<?> i = iterator(); i.hasNext(); ) {
            if (c.contains(i.next())) {
                i.remove();
                modified = true;
            }
        }
    }
    return modified;
}

将set中所有存在于集合c中的元素删除。如果c也是一个set,那么这个操作的操作结果为取集合set与c的差集。该方法首先选取set与c中较小的一个,如果set包含的元素较少,则通过迭代器迭代set中的元素,检测每个元素是否包含于c中,如果包含,则调用迭代器的删除方法进行元素的删除;如果c中的元素较少,则通过迭代器遍历c中的元素,并调用set的remove方法,删除对应的元素。在代码层看来,如果其中的数据在最不理想的情况下,两者的执行时间是相同的。但是当c中的contains方法或者set的remove方法作对应优化时,则会在效率上产生一些影响。当set的迭代器不支持删除操作时,将抛出UnsupportedOperationException。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值