如何用更精简的Java代码实现字符串重复单词的查找
重复单词查找代码优化方案
原实现的核心冗余问题
- 采用双层循环遍历单词数组做匹配比对,时间复杂度为O(n²),当输入的单词量变大后性能会快速下降
- 用普通字符串临时存储结果、通过字符串
contains方法判断重复的写法,会产生大量不必要的字符串中间对象;且代码中用!=做字符串相等判断的写法存在隐蔽bug——Java中!=比对的是对象引用地址,不是字符串内容,仅在字符串被常量池缓存时可能凑巧得到正确结果,换场景就会出错 - 手动拼接结果串的逻辑嵌套了多层if判断,代码分支冗余度高
与原输出结果完全对齐的优化实现
基础优化版(兼容Java 8+,逻辑清晰易读)
import java.util.*; public class DuplicateWordFinder { public static void main(String[] args) { String str = "a new, boy with new haircut boy, 3pm to boy 8pm margian 3pm to ghost"; // 与原逻辑保持一致的预处理:移除逗号、按空白分割单词 String[] words = str.replaceAll(",", "").split("\\s"); Map<String, Integer> wordCount = new HashMap<>(); // 单次遍历完成单词频次统计,替代原双层循环 for (String word : words) { wordCount.merge(word, 1, Integer::sum); } // 按首次出现顺序筛选重复单词,避免冗余的字符串拼接 Set<String> recorded = new HashSet<>(); List<String> duplicateList = new ArrayList<>(); for (String word : words) { if (wordCount.get(word) >= 2 && recorded.add(word)) { duplicateList.add(word); } } // 用工具方法直接拼接结果,无需手动判断分隔符 System.out.println(String.join(", ", duplicateList)); } }
运行后输出与原代码完全一致:new, boy, 3pm, to
精简流实现版(Java 11+,代码量比原实现减少60%以上)
import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; public class DuplicateWordFinder { public static void main(String[] args) { String str = "a new, boy with new haircut boy, 3pm to boy 8pm margian 3pm to ghost"; String result = Arrays.stream(str.replaceAll(",", "").split("\\s")) // 用LinkedHashMap保留单词首次出现的顺序,统计每个单词的出现次数 .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting())) .entrySet().stream() .filter(entry -> entry.getValue() >= 2) .map(Map.Entry::getKey) .collect(Collectors.joining(", ")); System.out.println(result); } }
优化涉及的Java核心特性
Map.merge():内置方法可自动完成“键不存在则初始化值、存在则按规则累加更新”的逻辑,替代多层if判断的手动计数Set.add():方法返回布尔值表示元素是否成功插入(不存在则插入并返回true,存在则返回false),可直接用来做去重判断,无需手动调用contains检查String.join():内置静态方法可直接拼接元素集合,自动在元素间插入指定分隔符,替代手动逐次拼接字符串的冗余逻辑- 不可变类特性:Java中
String是不可变对象,每次拼接都会生成新的字符串实例,临时存储结果优先用集合类,可减少不必要的内存开销 - 字符串比较规则:判断字符串内容相等必须用
equals()方法,直接用!=比对引用的写法属于典型的语法误用
内容的提问来源于stack exchange,提问作者Suvidh
相关产品推荐
相关产品推荐

