【集合类】源码解析之 Set接口、AbstractSet抽象类

Set接口

不包含重复元素的集合。 更正式地说,集合不包含一对元素e1.hash == e2.hash && e1.equals(e2) ,使得e1.equals(e2) ,并且最多一个空元素

类声明

public interface Set<E> extends Collection<E>

和Collection接口的方法一致,通过 equal()hashCode() 排重

AbstractSet抽象类

类声明

public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> 

构造函数

protected AbstractSet() {}

Set 方法实现

// 在此set集合中删除指定集合中的所有元素
public boolean removeAll(Collection<?> c) {
    Objects.requireNonNull(c);
    boolean modified = false;
	// 如果set集合大小大于指定集合,则迭代指定集合的元素进行删除
    if (size() > c.size()) {
        for (Iterator<?> i = c.iterator(); i.hasNext(); )
            // 只要成功删除了一个元素则返回true
            modified |= remove(i.next());
    } else {
        // 如果set集合大小小于等于指定集合,则迭代set集合中的元素进行删除
        for (Iterator<?> i = iterator(); i.hasNext(); ) {
            if (c.contains(i.next())) {
                // 只要成功删除了一个元素则返回true
                i.remove();
                modified = true;
            }
        }
    }
    return modified;
}

Collection 方法实现

// 比较指定元素与此set的相等性
public boolean equals(Object o) {
    if (o == this)
        return true;
	// 如果指定元素不是Set类型则返回false
    if (!(o instanceof Set))
        return false;
    Collection<?> c = (Collection<?>) o;
    // 如果两个set集合大小不相等则返回false
    if (c.size() != size())
        return false;
    try {
        // 如果set包含指定set中的所有元素则返回true
        return containsAll(c);
    } catch (ClassCastException unused)   {
        return false;
    } catch (NullPointerException unused) {
        return false;
    }
}

// 返回set的哈希码值,即set中所有元素的哈希值和
public int hashCode() {
    int h = 0;
    Iterator<E> i = iterator();
    while (i.hasNext()) {
        E obj = i.next();
        // null值不计算
        if (obj != null)
            h += obj.hashCode();
    }
    return h;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值