jdk源码分析之AbstractSet

本文详细解析了Java中AbstractSet抽象类的设计理念及其核心方法实现,包括hashCode计算、removeAll等方法的具体逻辑,并探讨了其如何继承AbstractCollection以减少代码重复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package java.util;


//提供一个Set实现的骨架,使得在实现Set接口时重复写很多相同的代码
//这些所谓相同的代码,就是作为一个所有Set应该具有的性质(或者说限制)和操作
//extends AbstractCollection<E>:
//Set作为一个Colletion,也应该具有一些Colletion应该具有的性质(或者说限制)和操作,也不用自己来写,直接继承,也是为了不重复写代码
//implements Set说明这个是个Set<E>,在一定意义上Set接口是个标记接口
//说实话,感觉有适配器的思想在里面,不管怎样,都可以作为向上转换为Colletion进行一些基本的操作(面对Colletion的操作,接口)
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {
 
            //本Set是否包含参数的全部
            //此处的containAll使用的就是AbstractCollection中的containAll方法
            //看,一点重复的方法都不会写,这些属于Colletion性质的方法就放在AbstractCollection去实现,
            //set是某种Colletion,所以直接继承AbstractCollection来获取这些作为Colletion的基本的性质(限制)和操作(就是这些方法的实现)
        } catch (ClassCastException unused)   {
            return false;
        } catch (NullPointerException unused) {
            return false;
        }
    }

   
    //Set的hash值就是把所有的元素(对象)的hash值相加,保证了相同的Set必须相同的hash值,但是反之不一定
    //null的hash值为0
    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中删除参数包含的所有元素(如果有的话)
    public boolean removeAll(Collection<?> c) {
    	//标记是否修改了
        boolean modified = false;
        //用数量少的那一个来进行迭代比较!这样比较次数会比较少,节省时间
        //很巧妙
        if (size() > c.size()) {
            for (Iterator<?> i = c.iterator(); i.hasNext(); )
            	//参数中的元素比较少,则参数中的所有元素调用remove进行查找,如果查找到并且删除,则 modified变为true
                modified |= remove(i.next());
        } else {
            for (Iterator<?> i = iterator(); i.hasNext(); ) {
            	//本Set中的元素比较少,迭代本Set的元素,看是否包含在参数的元素中,如果是,则remove
                if (c.contains(i.next())) {
                    i.remove();
                    modified = true;
                }
            }
        }
        return modified;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值