hashset通过hashcode()定位桶位置、equals()校验内容来判断重复,底层基于hashmap键唯一性实现;自定义对象须重写两者以保证相等对象哈希值相同;允许且仅允许一个null元素。

HashSet 通过对象的 hashCode() 和 equals() 方法协同判断是否重复,底层依赖 HashMap 的键唯一性来实现元素不重复。
哈希值定位 + 等值校验双重判断
添加元素时,并非只比对一个条件:
- 先调用元素的
hashCode()方法,计算哈希值,确定在底层哈希表(数组)中的“桶”位置 - 若该桶为空,直接插入
- 若桶中已有元素(发生哈希冲突),则遍历该桶中的所有对象,逐个调用
equals()方法比较内容是否相等 - 只有当
hashCode()相同 且equals()返回true时,才认定为重复,添加失败
底层其实是 HashMap 的键存储
HashSet 并没有自己独立的存储结构,而是内部持有一个 HashMap<e object></e> 实例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 你添加的元素作为 HashMap 的 key
- value 固定为一个静态占位对象
PRESENT - 利用 HashMap 本身“key 不可重复”的特性,自然保证了 Set 元素唯一
自定义对象必须重写两个方法
如果把自定义类(如 Student)放进 HashSet,却没重写 hashCode() 和 equals():
- 默认使用
Object类的方法,基于内存地址判断 - 即使两个对象内容完全一样,也会被视为不同元素,导致去重失效
- 必须同时重写两者,且保证:相等的对象(
equals() == true)必须返回相同的哈希值
允许 null,但仅限一个
HashSet 明确支持 null 元素:
-
hashCode()对null返回 0,会被放到哈希表索引为 0 的桶中 - 后续再添加
null时,会因equals(null, null) == true被判定为重复,添加失败 - 所以最多只能存一个
null
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










