应优先用string.equals()配合hashset或hashmap判重,避免==和list.contains();hashset利用hashcode()和equals()实现o(1)查重,hashmap可统计频次;需处理null和大小写敏感问题。

用数据结构配合 String.equals() 判定重复元素,核心在于:**避免直接用 == 比较字符串内容,优先用 equals() 判断语义相等,并结合合适的数据结构快速查重**。
用 HashSet 存储已见字符串
HashSet 基于哈希表实现,插入和查找平均时间复杂度为 O(1),且内部调用对象的 hashCode() 和 equals() 方法保证逻辑去重。对 String 来说,这两个方法已正确重写,可安全使用。
- 每次添加新字符串前,用
set.contains(str)判断是否已存在——它底层会调用str.equals(已有元素) - 若返回 true,说明该字符串(内容相同)已出现过,即为重复
- 注意:HashSet 不保证顺序,如需按首次出现顺序记录,可用 LinkedHashSet
用 HashMap 统计频次并识别重复
当不仅要判断是否重复,还要知道重复几次时,HashMap 是更合适的选择。key 是字符串,value 是出现次数。
- 遍历字符串集合,对每个
str执行:map.put(str, map.getOrDefault(str, 0) + 1) - 之后遍历 map,找出 value > 1 的 key,这些就是重复元素
- 全程依赖 String 自带的
equals()和hashCode(),无需手动比较
慎用 List.contains() 做重复检查
List(如 ArrayList)的 contains() 方法确实也调用 equals(),但其时间复杂度为 O(n),在大量数据下效率低,不适合高频查重场景。
- 仅适用于小规模、一次性校验,或必须保持插入顺序且不频繁查重的情况
- 不要在循环内反复调用
list.contains(str),否则整体退化为 O(n²) - 如果必须用 List,建议先转成 HashSet 再查重
警惕 null 和大小写敏感问题
String.equals() 对 null 不安全,且默认区分大小写,实际使用中常需预处理。
- 判空前加 null 检查:
str != null && seen.contains(str) - 如需忽略大小写,统一转成小写再比较:
str.toLowerCase()后存入 HashSet 或作为 Map key - 避免用
str.equalsIgnoreCase(other)直接替代 equals() 在集合中使用——因为 equalsIgnoreCase 不影响 hashCode,会导致哈希不一致











