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

