Java记录 -70- HashSet源码剖析

本文深入探讨了HashSet的工作原理,揭示了其如何通过哈希表支持来确保元素唯一性,并详细解析了HashSet构造方法及核心操作的具体实现。

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

HashSet不包含重复元素,由哈希表支持。

下面我就开始剖析下HashSet的源代码:

首先从构造方法开始;

    private transient HashMap<E,Object> map;    public HashSet() {        map = new HashMap<E,Object>();    }    public HashSet(Collection<? extends E> c) {        map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));    addAll(c);    }    public HashSet(int initialCapacity, float loadFactor) {        map = new HashMap<E,Object>(initialCapacity, loadFactor);    }    public HashSet(int initialCapacity) {        map = new HashMap<E,Object>(initialCapacity);    }

我们会惊奇的发现,HashSet的构造函数中竟然都做了HashMap的构造,直接使用HashMap。可是HashMap是键值映射的,HashSet是存对象的,这都可以吗?带着这个问题,我们接着向下看:

    // Dummy value to associate with an Object in the backing Map    private static final Object PRESENT = new Object();        public Iterator<E> iterator() {        return map.keySet().iterator();    }        public int size() {        return map.size();    }        public boolean isEmpty() {        return map.isEmpty();    }    public boolean contains(Object o) {        return map.containsKey(o);    }    public boolean add(E e) {        return map.put(e, PRESENT)==null;    }    public boolean remove(Object o) {        return map.remove(o)==PRESENT;    }    public void clear() {        map.clear();    }

由上面的一系列方法可以看出,HashSet就是一个壳啊,内部都是调用了HashMap的方法来实现。

add方法是将要添加的元素作为HashMap的key添加的,HashMap的key不能重复,这样HashSet的元素也就不会重复了,高明啊。那么HashMap的值又存的什么呢?PRESENT,一个静态的,Object类型的变量。这个HashMap中key存放了HashSet要存放的元素,而value则存放了统一的一个静态的Object变量。这个PRESENT为什么要static final的呢?省空间呗。

如此看来,HashSet的实现好简单啊,完全借用了HashMap来构造使用,所有的实现都交给了HashMap。HashMap又是怎么实现的呢?让我们期待HashMap源代码的剖析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值