
本文详解如何用 substring() 实现字符串反转,并提供包括 StringBuilder、双指针数组、循环拼接等 4 种专业级实现方式,兼顾可读性、性能与教学实用性。
本文详解如何用 `substring()` 实现字符串反转,并提供包括 stringbuilder、双指针数组、循环拼接等 4 种专业级实现方式,兼顾可读性、性能与教学实用性。
在 Java 中,String.substring(int beginIndex, int endIndex) 的设计是左闭右开的——即从 beginIndex(含)开始,到 endIndex(不含)结束,且严格要求 0 ≤ beginIndex ≤ endIndex ≤ string.length()。因此像 word.substring(6, 3) 这类“倒序索引”写法会直接抛出 StringIndexOutOfBoundsException,这是初学者常遇的核心误区。
但值得注意的是:仅靠 substring() 单次调用无法完成反转;它本质是“切片工具”,而非“重构工具”。真正可行的思路是:用 substring() 在循环中逐段提取字符(如每次取末尾一个字符),再拼接成新字符串。下面给出四种规范、可运行的实现方案,全部基于标准 JDK,无需额外依赖。
✅ 方案一:推荐 —— 使用 StringBuilder.reverse()(简洁高效)
这是最符合工程实践的写法,代码简洁、性能最优(时间复杂度 O(n),内部基于字符数组原地交换):
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter a word: ");
String word = input.next();
// 输入校验(保留你原有的数字过滤逻辑)
while (word.matches(".*\d.*")) {
System.out.println("Please enter a valid word!");
word = input.next();
}
String reversed = new StringBuilder(word).reverse().toString();
System.out.println("Reversed word: " + reversed);
input.close();
}
}
✅ 方案二:手动双指针反转(深入理解原理)
适用于学习算法逻辑或面试手写——通过 toCharArray() 转为数组,用两个索引 i(头)和 j(尾)向中间靠拢并交换:
public static String reverse(String str) {
if (str == null || str.length() <h3>✅ 方案三:循环 + <code>substring()</code> 拼接(满足题目硬性要求)</h3><p>此方案<strong>显式使用 <code>substring()</code></strong>,每次取最后一个字符(<code>str.substring(len-1)</code>)并追加到结果串前,实现“倒序构建”:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8775" title="Java Maven Common"><img
src="https://img.php.cn/upload/skill/000/000/081/179222954019613.jpg" alt="Java Maven Common" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill8775" title="Java Maven Common" class="overflowclass">Java Maven Common</a>
<p class="overflowclass">Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。</p>
</div>
<a rel="nofollow" href="/xiazai/skill8775" title="Java Maven Common" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><pre class="brush:php;toolbar:false;">public static String reverseUsingSubstring(String str) {
String result = "";
int len = str.length();
for (int i = len - 1; i >= 0; i--) {
result += str.substring(i, i + 1); // 取单个字符:[i, i+1)
}
return result;
}⚠️ 注意:该方式时间复杂度为 O(n²)(因字符串不可变,每次 += 都新建对象),仅适合教学演示,不用于生产环境。
✅ 方案四:纯 substring() 组合(进阶技巧,不推荐)
以下写法虽“只用 substring”,但逻辑晦涩、易错且效率极低,仅作知识拓展:
public static String reversePureSubstring(String str) {
if (str.length() <p>该逻辑通过反复截取首尾片段重组字符串,但边界计算极易出错,<strong>强烈建议避免使用</strong>。</p><h3>? 关键总结</h3>
-
substring()本身不支持逆向索引,但可作为“字符提取器”配合循环使用; - 生产代码首选
StringBuilder.reverse()—— 它是 JDK 官方优化过的标准解法; - 手动数组交换有助于理解底层机制,是算法学习的基石;
- 字符串拼接(
+=)在循环中性能差,若坚持用字符串操作,应改用StringBuilder显式追加; - 输入校验逻辑(如过滤数字)应放在读取后立即处理,避免无效计算。
运行任一方案,输入 java 将输出 avaj,输入 hello 输出 olleh —— 简洁、可靠、可扩展。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










