HashSet源码解析

news/2024/11/30 12:52:37/

前言

HashSet ,基于 HashMap 的 Set 实现类。在业务中,如果我们有排重的需求,一般会考虑使用 HashSet 。

hashset类图
在这里插入图片描述

实现 java.util.Set 接口,并继承 java.util.AbstractSet 抽像类。
实现 java.io.Serializable 接口。
实现 java.lang.Cloneable 接口

HashSet内部属性
在这里插入图片描述
HashSet内部属性就两个

private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();

map 的 key ,存储 HashSet 的每个 key 。
map 的 value ,因为 HashSet 没有 value 的需要,所以使用一个统一的 PRESENT 即可。代码如下:

构造方法

    /*** Constructs a new, empty set; the backing <tt>HashMap</tt> instance has* default initial capacity (16) and load factor (0.75).*/public HashSet() {map = new HashMap<>();}/*** Constructs a new set containing the elements in the specified* collection.  The <tt>HashMap</tt> is created with default load factor* (0.75) and an initial capacity sufficient to contain the elements in* the specified collection.** @param c the collection whose elements are to be placed into this set* @throws NullPointerException if the specified collection is null*/public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}/*** Constructs a new, empty set; the backing <tt>HashMap</tt> instance has* the specified initial capacity and the specified load factor.** @param      initialCapacity   the initial capacity of the hash map* @param      loadFactor        the load factor of the hash map* @throws     IllegalArgumentException if the initial capacity is less*             than zero, or if the load factor is nonpositive*/public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}/*** Constructs a new, empty set; the backing <tt>HashMap</tt> instance has* the specified initial capacity and default load factor (0.75).** @param      initialCapacity   the initial capacity of the hash table* @throws     IllegalArgumentException if the initial capacity is less*             than zero*/public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}/*** Constructs a new, empty linked hash set.  (This package private* constructor is only used by LinkedHashSet.) The backing* HashMap instance is a LinkedHashMap with the specified initial* capacity and the specified load factor.** @param      initialCapacity   the initial capacity of the hash map* @param      loadFactor        the load factor of the hash map* @param      dummy             ignored (distinguishes this*             constructor from other int, float constructor.)* @throws     IllegalArgumentException if the initial capacity is less*             than zero, or if the load factor is nonpositive*/HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}

在构造方法中,会创建 HashMap 或 LinkedHashMap 对象。

添加单个元素

#add(E e) 方法,添加单个元素。代码如下:

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

map 的 value 值,就是我们看到的 PRESENT
private static final Object PRESENT = new Object();

而添加多个元素,继承自 AbstractCollection 抽象类,通过 #addAll(Collection<? extends E> c) 方法,代码如下:

public boolean addAll(Collection<? extends E> c) {boolean modified = false;// 遍历 c 集合,逐个添加for (E e : c)if (add(e))modified = true;return modified;
}

在方法内部,会逐个调用 #add(E e) 方法,逐个添加单个元素。

移除单个元素

#remove(Object key) 方法,移除 key 对应的 value ,并返回该 value 。代码如下:


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

查找单个元素

public boolean contains(Object o) {return map.containsKey(o);
}

清空


public void clear() {map.clear();
}

总结

HashSet 是基于 HashMap 的 Set 实现类。

hashmap源码分析:https://blog.csdn.net/qq_42600094/article/details/130556792


http://www.ppmy.cn/news/65172.html

相关文章

kt:reified和sam转换(Single Abstract Method Conversions)

什么是refied关键字 ​由于我们都知道Kotlin和Java一样都存在着泛型擦除问题&#xff0c;而Kotlin它知道Java所带来的这个问题&#xff0c;所以对此Kotlin留了一个后门&#xff0c;就是通过inline函数保证使得泛型类的类型实参在运行时能够保留&#xff0c;这样的操作 Kotlin 中…

MYSQL的主键和外键,内连接和外连接,关联子查询

目录 友情提醒第一章&#xff1a;MYSQL数据库多表主键和外键1&#xff09;外键介绍&#xff08;FOREIGN KEY&#xff09;2&#xff09;外键约束作用2&#xff09;三种情况下添加外键约束①一对一关系②一对多关系多对多关系 4&#xff09;删除外键约束 第二章&#xff1a;MYSQL…

双向链表的功能实现

前言&#xff1a;我们已经学习并知道了单链表的实现&#xff0c;链表的实现方式不只是单链表一种&#xff0c;今天我们就来介绍一种新的结构&#xff0c;就是双链表结构&#xff0c;本质上是将节点间进行双向链接&#xff0c;从而使一些操作更加容易实现。 目录 1.双向链表的简…

linux命令之openssl详解

openssl 强大的安全套接字层密码库 Linux命令在线工具&#xff1a;linux在线工具 个人博客网站&#xff1a;博客网站 补充说明 OpenSSL 是一个强大的安全套接字层密码库&#xff0c;囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议&#xff0c;并提供丰富的应用…

任务提醒工具:Gestimer for Mac

Gestimer for Mac是一款运行在mac平台上的任务提醒工具&#xff0c;可以帮助用户快速地创建提醒事项&#xff0c;提醒用户完成重要的任务。它采用了简单的手势操作&#xff0c;让用户可以更加快速地创建和管理提醒事项&#xff0c;提高了工作效率。 Gestimer是一款美丽的菜单栏…

二十一、线索转换1:点击转换按钮加载信息、搜索市场活动

功能需求 *在线索转换页面,展示:fullName,appellation,company,owner 流程图 代码实现 1.ClueMapper /*** 通过id查询线索详情* param id 线索id* return 对应id的线索*/Clue selectClueForDetailById(String id); ClueMapper.xml <select id"selectClueForDetailByI…

在Win10系统下,应用软件找不到映射的网络驱动器,怎么解决

最近我在用powerbi desktop时&#xff0c;在更新新版后&#xff0c;突然就无法来连接映射的网络驱动盘&#xff0c;然后测试了各种办法&#xff0c;最后通过更改注册表解决了 从Windows功能打开SMB 直通并编辑名为EnableLinkedConnections的注册表项。 打开“程序和功能”里的“…

互联网摸鱼日报(2023-05-09)

互联网摸鱼日报&#xff08;2023-05-09&#xff09; InfoQ 热门话题 面向数字化提质提效的低代码架构设计 | 低代码技术内幕 提升字节规模化效能的平台化思路 &#xff5c; 极客有约 从微服务转为单体架构、成本降低 90%&#xff0c;亚马逊内部案例引发轰动&#xff01;CTO&…