You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java单词反转程序优化咨询及代码优化理论探讨

问题描述

我设计了一个编码挑战任务,要求反转句子中每个单词的字符,但保持单词在句子中的原有顺序。输入示例如下:RemoteIo is awesome-Candiates pass interview-best candiates are selected,对应的输出需为每个单词字符反转后的句子,输入句子以-分隔,且仅包含字母和单个空格。以下是我的Java实现代码,请问如何优化该代码?同时想了解代码优化的相关理论与原则。

public class Test1 {
    public static void main (String[] args) throws java.lang.Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        
        // Put sentences to a String array.
        String[] data = input.split("-");
        
        // Loop throw sentence array
        for(int i = 0; i < data.length; i++) {
            
            // Put the words from the sentence to a String array.
            String[] words = data[i].split(" ");
            
            // Loop throw the word array
            for(int w = 0; w < words.length; w++) {
                
                // Revert the characters of each word
                for (int j = words[w].length() - 1;  j >=0; j--) {
                    if (j != 0) {
                        System.out.print(words[w].charAt(j));
                    } else {
                        System.out.print(words[w].charAt(j) + " ");
                    }
                }
                if ( w == words.length -1) {
                    System.out.println();
                }
            }
        }
    }
}

优化后的代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringJoiner;

public class ReverseWords {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        
        String[] sentences = input.split("-");
        for (String sentence : sentences) {
            String[] words = sentence.split(" ");
            StringJoiner reversedSentence = new StringJoiner(" ");
            for (String word : words) {
                reversedSentence.add(new StringBuilder(word).reverse().toString());
            }
            System.out.println(reversedSentence);
        }
    }
}

具体优化点
  • 降低IO操作开销:原代码逐字符输出,每次System.out.print都会触发控制台IO,这类操作的性能开销远高于内存计算。优化后先拼接好整个反转后的句子,再一次性输出,大幅减少IO次数。
  • 简化反转逻辑:用JDK内置的StringBuilder.reverse()代替手动字符循环反转,该方法经过官方优化,性能更稳定,代码也更简洁。
  • 优化空格与换行处理:使用StringJoiner自动处理单词间的空格,无需手动判断是否为最后一个单词;直接输出拼接好的句子,自然完成换行,避免了原代码中繁琐的条件判断。
  • 提升代码可读性:替换普通for循环为增强for循环,去掉冗余的索引变量;将data这类模糊命名改为sentences,变量语义更清晰,降低后续维护成本。

代码优化的核心理论与原则
  1. 优先减少高开销操作:IO、网络、磁盘读写这类操作的耗时通常是内存操作的数倍甚至数千倍,优化时应优先减少这类操作的次数。
  2. 复用成熟工具类:JDK提供的工具类(如StringBuilder、StringJoiner)经过大量测试和性能调优,比手动实现的逻辑更高效、更不易出错,避免重复造轮子。
  3. 可读性是基础:优化不能以牺牲代码可读性为代价——语义化命名、简洁的结构能让其他开发者快速理解代码,这是长期维护和迭代的关键。
  4. 避免过早优化:先保证代码功能正确、逻辑清晰,再针对实际性能瓶颈进行优化。大部分场景下,可读性带来的收益远大于微小的性能提升。
  5. 控制对象创建:虽然StringBuilder会创建对象,但相比原代码中隐式的多次字符串拼接(会生成大量临时String对象),它的对象创建更可控,内存开销更小。

内容的提问来源于stack exchange,提问作者Hoang Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:15:34