在Java开发中,数字字符串反转是常见的基础操作,无论是校验回文数字、处理特殊编码还是做数据格式转换,都可能会用到这个功能。下面我们先看一张示意图,直观了解字符串反转的基本逻辑。

方法一:使用StringBuilder的reverse方法
这是Java中最简洁的实现方式,StringBuilder内置了reverse方法,可以直接对字符序列进行反转,代码量少且可读性高。
public class StringReverseDemo {
public static String reverseByStringBuilder(String numStr) {
if (numStr == null) {
return null;
}
// 直接使用StringBuilder的reverse方法反转
return new StringBuilder(numStr).reverse().toString();
}
public static void main(String[] args) {
String testStr = "12345";
System.out.println(reverseByStringBuilder(testStr)); // 输出54321
}
}这种方式的优势是代码简洁,不需要手动处理字符遍历,StringBuilder的reverse方法是 native 实现,性能也比较稳定。不过需要注意,如果字符串中包含前导零,反转后前导零会变成尾随零,比如"0123"反转后是"3210",如果业务需要去掉尾随零,需要额外处理。
方法二:循环遍历字符拼接
如果不想使用StringBuilder,也可以通过循环从字符串末尾开始遍历,逐个拼接字符实现反转,这种方式更贴近底层逻辑,适合理解反转的实现原理。
public class StringReverseDemo {
public static String reverseByLoop(String numStr) {
if (numStr == null) {
return null;
}
String result = "";
// 从最后一个字符开始向前遍历
for (int i = numStr.length() - 1; i >= 0; i--) {
result += numStr.charAt(i);
}
return result;
}
public static void main(String[] args) {
String testStr = "67890";
System.out.println(reverseByLoop(testStr)); // 输出09876
}
}这种方式的缺点是每次拼接字符串都会生成新的String对象,因为String是不可变的,如果字符串长度很长,会产生大量临时对象,性能不如StringBuilder的实现。如果是短字符串场景,性能差异可以忽略,但长字符串场景下不推荐。
方法三:使用char数组转换反转
还可以先将字符串转换为char数组,然后交换数组前后对应位置的字符,最后再将数组转回字符串,这种方式避免了String拼接的性能问题,也不需要依赖StringBuilder的reverse方法。
public class StringReverseDemo {
public static String reverseByCharArray(String numStr) {
if (numStr == null) {
return null;
}
char[] charArray = numStr.toCharArray();
int left = 0;
int right = charArray.length - 1;
// 交换前后对应位置的字符
while (left < right) {
char temp = charArray[left];
charArray[left] = charArray[right];
charArray[right] = temp;
left++;
right--;
}
return new String(charArray);
}
public static void main(String[] args) {
String testStr = "98761";
System.out.println(reverseByCharArray(testStr)); // 输出16789
}
}这种方式的性能比循环拼接String更好,因为char数组的交换操作是在原数组上进行的,不会产生额外的字符串对象,逻辑也比较清晰,适合需要自己控制反转过程的场景。
方法四:使用Apache Commons Lang的StringUtils
如果项目中已经引入了Apache Commons Lang依赖,可以直接使用StringUtils.reverse方法,该方法已经封装了反转逻辑,还做了空值处理,使用起来更省心。
import org.apache.commons.lang3.StringUtils;
public class StringReverseDemo {
public static String reverseByCommons(String numStr) {
// StringUtils.reverse内部已经处理了null的情况,null会返回null
return StringUtils.reverse(numStr);
}
public static void main(String[] args) {
String testStr = "11223";
System.out.println(reverseByCommons(testStr)); // 输出32211
System.out.println(reverseByCommons(null)); // 输出null
}
}这种方式的优势是依赖成熟工具类,减少了自己写代码可能出现的边界问题,不过需要额外引入第三方依赖,如果是轻量级项目或者不想引入额外依赖,就不太适合。
不同方法的对比与最佳实践
我们可以通过下面的表格对比四种方法的特性:
| 实现方法 | 代码简洁度 | 性能表现 | 依赖情况 | 适用场景 |
|---|---|---|---|---|
| StringBuilder reverse | 高 | 好 | 无额外依赖 | 大部分常规场景,优先推荐 |
| 循环遍历拼接 | 中 | 差(长字符串) | 无额外依赖 | 学习原理、短字符串场景 |
| char数组交换 | 中 | 好 | 无额外依赖 | 需要自定义反转逻辑、不想用StringBuilder的场景 |
| Apache Commons Lang | 高 | 好 | 需要引入第三方包 | 项目已有该依赖、需要成熟工具类处理的场景 |
综合来看,如果是常规的数字字符串反转场景,优先推荐使用StringBuilder的reverse方法,它不需要额外依赖,代码简洁,性能也有保障。如果项目已经引入了Apache Commons Lang,也可以用StringUtils.reverse,减少重复代码。如果需要对反转过程做自定义处理,比如过滤特定字符、处理前导零,可以选择char数组的方式手动实现。尽量避免使用循环拼接String的方式,尤其是处理长字符串时,性能损耗会比较明显。
另外需要注意边界场景的处理,比如输入为null的情况,大部分方法都需要提前做判空,避免空指针异常。如果数字字符串包含负数符号,比如"-123",反转后会变成"321-",如果业务需要保持负数符号在开头,需要先提取符号,反转后面的数字部分,再拼接符号,这部分可以根据实际业务需求做额外处理。
Java字符串反转数字字符串StringBuilderApache_Commons_Lang修改时间:2026-06-02 04:37:10