hashset通过hashcode()定位桶位置、equals()判断重复,底层基于hashmap键唯一机制实现;自定义对象必须同时重写hashcode()和equals()以保证唯一性。

HashSet 通过对象的 hashCode() 和 equals() 方法协同工作来保证元素唯一性,底层依赖 HashMap 的键唯一机制。
哈希值定位桶位置
添加元素时,HashSet 先调用元素的 hashCode() 方法,计算出哈希值;再经扰动函数和取模运算,确定该元素在底层哈希表(数组)中的存储“桶”(bucket)位置。
- 若该桶为空,直接插入元素
- 若桶中已有元素,说明发生哈希冲突,进入下一步比对
equals 方法确认是否重复
当多个对象哈希值相同(即落在同一个桶),HashSet 会遍历该桶中的所有元素,逐个调用 equals() 方法与新元素比较:
- 只要有一个已存在元素与新元素
equals()返回 true,就判定为重复,添加失败 - 只有所有比较都返回 false,才将新元素加入该桶
底层其实是 HashMap 的键映射
HashSet 内部持有一个 HashMap<e object></e> 实例,添加的每个元素都作为 key 存入,value 固定为一个静态占位对象 PRESENT:
-
set.add(e)实际执行的是map.put(e, PRESENT) - 而 HashMap 本身要求 key 不可重复,自然继承了唯一性保障
自定义对象必须重写两个方法
如果把自定义类(如 Student)的实例存入 HashSet,必须同时重写 hashCode() 和 equals():
- 只重写
equals()不重写hashCode():相同对象可能被分配到不同桶,equals()根本不会被调用,导致逻辑上重复却未去重 - 只重写
hashCode()不重写equals():哈希一致但内容不同的对象可能被误判为重复 - 两者保持一致,才能让“相等的对象有相同哈希值”,这是唯一性成立的前提
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











