JDK源码分析-HashSet

概述

HashSet是Java集合框架中非常重要的一个类,它实现了Set接口,不允许出现重复元素,并且元素是无序的。HashSet的底层实现主要依赖于HashMap,通过HashMap来存储元素。如果想要了解HashMap,可以查看后续文章。

类图

从以上类图可以看到,HashSet实现了三个接口,继承了一个抽象类:

  • Serializable接口,表示HashSet支持序列化功能
  • Cloneable接口,表示HashSet支持克隆
  • Set接口,主要提供了添加、删除、遍历等功能
  • AbstractSet抽象类,主要提供元素对比、删除等操作

源码解读

成员变量

// 底层依赖HashMap,用于存储数据
private transient HashMap<E,Object> map;  
// PRESENT是一个静态常量对象,用于作为HashMap的value
// 因为HashSet只关心key(即HashSet中的元素),不关心value,所以这里使用了一个统一的占位符对象
// Dummy value to associate with an Object in the HashMap
private static final Object PRESENT = new Object();

构造方法

HashSet 中提供了四种构造方案:

  • public HashSet()默认构造函数
  • public HashSet(Collection<? extends E> c)创建一个包含集合c中所有元素的hashSet集合
  • public HashSet(int initialCapacity)创建一个自定义的初始容量和默认的负载因子0.75的hashSet集合
  • public HashSet(int initialCapacity, float loadFactor)创建一个自定义的初始容量和负载因子的hashSet集合

添加元素

HashSet的添加元素操作是通过调用HashMap的put方法实现的。由于HashSet只关心key,所以value统一使用PRESENT

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

这里需要注意的是,HashMap的put方法会返回旧值,如果key不存在则返回null。因此,当HashSet添加一个新元素时,如果put方法返回null,说明元素添加成功;如果返回非null值,说明元素已经存在,添加失败。 

删除元素

HashSet的删除元素操作是通过调用HashMap的remove方法实现的。

public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

同样地,HashMap的remove方法会返回被删除元素的旧值。如果HashSet成功删除了一个元素,那么remove方法应该返回PRESENT;否则返回null。

其他操作

HashSet还提供了其他操作,如判断元素是否存在(contains方法)、获取元素数量(size方法)、清空集合(clear方法)等,这些操作都是直接调用底层HashMap的相应方法实现的。

总结

HashSet的底层实现主要依赖于HashMap。HashSet通过HashMap来存储元素,并利用HashMap的特性实现了不重复和无序的要求。

 

posted @   小草丶  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示