You need to enable JavaScript to run this app. 如何用更精简的Java代码实现字符串重复单词的查找
优惠活动
大模型
产品
解决方案
定价
更多

如何用更精简的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 22:27:04