hashset 只能存一个 null,因其底层用 hashmap 存储,null key 均映射到哈希值 0 的桶位,且用 == 判断重复;首次 add(null) 返回 true,再次返回 false,size 保持为 1。

Java 的 HashSet 允许存储一个 null 元素,且仅能存一个。
为什么只能存一个 null?
HashSet 底层基于 HashMap 实现,元素作为 HashMap 的 key 存储。而 HashMap 对 null key 的处理是:所有 null key 都被映射到同一个内部桶位置(即哈希值视为 0),并且 HashMap 会用引用相等(==)判断 key 是否已存在。因此,第二次添加 null 时会被认为是重复元素,添加失败。
添加 null 的实际表现
调用 add(null) 会返回 true(首次添加成功);再次调用仍返回 false,集合大小不变。示例:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
Set<string> set = new HashSet(); System.out.println(set.add(null)); // true System.out.println(set.add(null)); // false System.out.println(set.size()); // 1 </string>
遍历和使用 null 元素的注意事项
可以正常遍历、查找、删除 null 元素,但需注意:
-
contains(null)返回true(如果已存在) -
remove(null)成功移除并返回true - 若集合中没有
null,调用remove(null)或contains(null)不会报错,只是返回false - 在增强 for 循环中访问元素时,若未判空直接调用方法(如
e.toString()),可能触发NullPointerException
与其它 Set 实现的对比
TreeSet 不允许 null(除非构造时传入自定义比较器且明确支持 null),否则添加时抛 NullPointerException;LinkedHashSet 行为与 HashSet 一致,也只允许一个 null。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










