HashSet通过HashMap实现字符串去重,依赖String重写的hashCode()和equals()方法:先哈希定位桶,再equals比较内容;大小写、空格及零宽字符均影响结果;支持null(仅一个);忽略大小写需预处理或改用TreeSet。

Java 中的 HashSet 通过哈希表(底层是 HashMap)实现,自动保证元素不重复。存储字符串时,它依赖 String 类重写的 hashCode() 和 equals() 方法来判断是否重复。
字符串去重靠 hashCode() 和 equals() 协同工作
HashSet 添加字符串时,会先计算其 hashCode() 值,定位到哈希桶;如果桶中已有元素,再用 equals() 逐个比较内容是否相等。只有两个方法都一致,才视为重复,不会添加。
-
"abc".hashCode()和"abc".equals("abc")都返回 true → 视为同一元素 -
"ABC"和"abc"的hashCode()不同、equals()也返回 false → 被当作不同元素 - 大小写敏感、空格、不可见字符(如
\u200B)都会影响去重结果
基本用法:直接 add() 就能去重
不需要额外处理,只要把字符串放进 HashSet,重复内容自然被忽略:
Set<string> set = new HashSet();
set.add("hello");
set.add("world");
set.add("hello"); // 这行无效,集合大小仍为 2
System.out.println(set); // 可能输出 [world, hello](无序)</string>
注意点:null 值可以存且只存一个
HashSet 允许存一个 null 字符串,再次添加 null 会被忽略:
-
set.add(null);→ 成功 -
set.add(null);→ 无效果,集合不变 -
set.contains(null)返回true
如果需要忽略大小写去重,得自己包装或预处理
HashSet 默认区分大小写。若想让 "Hello" 和 "HELLO" 算重复,不能直接改 String 类,常见做法有:
- 存入前统一转小写:
set.add(str.toLowerCase()) - 使用
TreeSet配合String.CASE_INSENSITIVE_ORDER比较器 - 自定义封装类,重写
hashCode()和equals()(较少用)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











