HashSet

HashSet,顾名思义,我们可以得到两点信息:

1. 实现了 Set 接口。

2. 通过 Hash 表实现。所以它的 element 是无序的。

下面看一下 add 方法的源码:

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
    private transient HashMap<E,Object> map;
    private static final Object PRESENT = new Object();

原来 HashSet 是通过 HashMap 实现的,刚看到这样的实现的时候,我想立马反对一下这种做法:

1. 对于 HashSet 里面的每个 element,都需要存一个 PRESENT 的对象,即浪费空间,又浪费时间。

后来又一想,如果我是 这段代码的作者,我可以这这样解释:

1. 减少代码冗余,相同的 hash 逻辑,只需要维护一份就可以了。

2. 关于空间浪费,PRESENT 是 static final 的,也就是说,在对空间中只有一份,空间浪费可以忽略不计。对于每个 element 的存的指针空间,空间也不大。

我网上搜了一下,也没有什么特别信服人的理由,它就是通过这种方法来实现了而已。

 

参考链接:

1. https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html

2. https://stackoverflow.com/questions/2235546/why-does-hashset-implementation-in-sun-java-use-hashmap-as-its-backing

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值