HashSet.add()添加重复元素返回false,因其设计目标是保证元素唯一性;依据equals()和hashCode()判断重复,内部委托HashMap.put()实现;自定义类须同时一致重写这两个方法,否则导致查找异常。

Java 中 HashSet.add() 添加重复元素时,返回值是 false。
为什么返回 false?
因为 HashSet 的设计目标是保证元素唯一性。当尝试添加一个已存在的元素(依据 equals() 和 hashCode() 判断),集合不会发生任何变化,add() 方法就明确表示“本次操作未改变集合内容”,所以返回 false。
返回值的准确含义
- true:元素是新的,成功插入,集合大小 +1
- false:元素已存在,未插入,集合大小不变
底层是怎么判断重复的?
它依赖内部 HashMap 的 put() 行为:
- 先用
e.hashCode()定位哈希桶 - 桶中已有元素时,逐个调用
e.equals(已有元素) - 只要有一个
equals()返回 true,就认定重复,put()返回旧值(非null),导致add()返回 false
自定义类要注意什么?
如果把自定义对象放进 HashSet,必须同时、一致地重写 hashCode() 和 equals() 方法:
立即学习“Java免费学习笔记(深入)”;
- 只重
equals()不重hashCode()→ 可能被分到不同桶,equals()根本不执行,导致“假重复” - 两个方法逻辑不一致(比如
equals()比较 name,hashCode()却基于 id)→ 行为不可预测 - 用可变字段参与计算后又修改字段 → 元素可能再也找不到了,或被误判为新元素


















