HashSet通过hashCode()定位桶、equals()精确比较判断元素是否存在;自定义类作元素时须重写二者且保持一致,否则查找失败。

HashSet 通过 hashCode() 和 equals() 方法共同判断元素是否存在。它不直接遍历所有元素,而是先计算待查找对象的哈希值,定位到对应的桶(bucket),再在该桶内逐个调用 equals() 比较。
底层依赖 hash 码快速定位
HashSet 底层基于 HashMap 实现,添加或查找元素时,首先调用对象的 hashCode() 方法得到一个整数哈希值,再通过位运算映射到内部数组的某个索引位置(即“桶”)。如果该位置为空,说明肯定不存在;如果不为空,才进入下一步比对。
同桶内用 equals() 精确判定
多个对象可能因哈希冲突落在同一个桶中(比如 String "ABC" 和 "CBA" 可能哈希值不同但取模后索引相同)。此时 HashSet 会遍历该桶中的所有节点,对每个节点调用 obj.equals(待查对象)。只有当 hashCode() 相同且 equals() 返回 true,才认为元素存在。
使用时必须保证一致性
为确保正确查找,自定义类作为 HashSet 元素时,必须同时重写 hashCode() 和 equals(),且逻辑保持一致:
- 两个对象
equals()返回true,它们的hashCode()必须相等 - 哈希值在对象存入 HashSet 后不应改变(避免修改影响查找)
- 推荐用 IDE 自动生成这两个方法,或使用 Lombok 的
@EqualsAndHashCode
实际判断操作很简单
调用 set.contains(obj) 即可,返回 boolean:
HashSet<string> set = new HashSet();
set.add("hello");
System.out.println(set.contains("hello")); // true
System.out.println(set.contains("world")); // false
</string>
对于自定义类型,只要重写了正确的方法,contains() 就能正常工作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











