HashSet检查包含关系核心用contains(),平均O(1);自定义类须重写equals()和hashCode();子集用containsAll();允许null但泛型需类型匹配;哈希不均或对象修改字段会降低性能。

Java 中用 HashSet 检查包含关系,核心方法是 contains(),它判断某个元素是否存在于集合中。这个操作平均时间复杂度为 O(1),效率很高。
用 contains() 判断单个元素是否存在
这是最常用的方式。注意:元素的 equals() 和 hashCode() 方法必须正确实现,否则可能返回错误结果(尤其是自定义对象)。
- 对于字符串、Integer 等 JDK 内置类型,开箱即用,无需额外处理
- 对于自定义类(如
User),必须重写equals()和hashCode(),且逻辑要一致 - 示例:set.contains("apple") 返回 true 或 false
检查一个集合是否完全包含另一个集合(子集关系)
HashSet 本身不直接提供“是否为子集”的方法,但可以用 containsAll() 实现:
-
bigSet.containsAll(smallSet) —— 判断
smallSet的所有元素是否都在bigSet中 - 该方法内部遍历
smallSet,对每个元素调用contains() - 如果
smallSet为空,结果恒为 true
注意 null 值和类型安全
HashSet 允许存一个 null 元素,contains(null) 可以正常工作。
立即学习“Java免费学习笔记(深入)”;
- 但若集合声明为泛型(如
Set<string></string>),传入非 String 类型会触发编译警告或 ClassCastException - 建议始终使用泛型,并确保比较对象类型匹配,避免运行时异常
- 例如:set.contains(123) 对
Set<string></string>总是返回 false(不会抛异常,但逻辑上不成立)
性能与常见误区
contains() 高效的前提是哈希分布均匀。以下情况会影响准确性或性能:
- 自定义对象未重写
hashCode()→ 所有实例哈希值相同 → 退化为链表查找,O(n) - 重写了
hashCode()但没重写equals()→ 可能漏判相等对象 - 修改了已加入 Set 的对象的字段(影响
hashCode())→ 后续contains()可能找不到它


















