使用 StringBuilder 或者 StringBuffer 类的 reverse() 方法。用法如下:
// StringBuilder 的用法 String str = "hello world"; StringBuilder builder = new StringBuilder(str); builder.reverse(); System.out.println(builder.toString()); // StringBuffer 的用法 String str = "hello world"; StringBuffer buffer = new StringBuffer(str); buffer.reverse(); System.out.println(buffer.toString());
运行上面代码,输出结果:
dlrow olleh dlrow olleh
注意,StringBuilder 和 StringBuffer 均继承了 AbstractStringBuilder 抽象类。StringBuilder 线程不安全,而 StringBuffer 是线程安全的。它们的 reverse() 实现源码如下:
// StringBuilder.java
@Override
public StringBuilder reverse() {
// 调用超类 AbstractStringBuilder 的 reverse() 方法
super.reverse();
return this;
}StringBuffer 的 reverse() 方法源码如下:
// StringBuffer.java
@Override
public synchronized StringBuffer reverse() {
toStringCache = null;
// 调用超类 AbstractStringBuilder 的 reverse() 方法
super.reverse();
return this;
}// AbstractStringBuilder.java
public AbstractStringBuilder reverse() {
byte[] val = this.value;
// 存放的字符个数
int count = this.count;
// 用于对 value 中的字节进行编码的编码ID
int coder = this.coder;
int n = count - 1;
if (COMPACT_STRINGS && coder == LATIN1) {
// 使用二分法,从数组中间开始置换,假如有一个数组 a,长度为6
// n=5
// j=(n-1)>>1 => 4>>1(除2) => 0100>>1 => 0010 => 0010=2
// j=2 k=n-j=3 ==> a[j] 和 a[k] 互换,即 a[2] 和 a[3]
// j=1 k=n-j=4 ==> a[j] 和 a[k] 互换,即 a[1] 和 a[4]
// j=0 k=n-j=5 ==> a[j] 和 a[k] 互换,即 a[0] 和 a[5]
for (int j = (n-1) >> 1; j >= 0; j--) {
int k = n - j;
byte cj = val[j];
val[j] = val[k];
val[k] = cj;
}
} else {
StringUTF16.reverse(val, count);
}
return this;
}使用第三方库实现字符串反转。
使用 commons-lang3 库的 StringUtils 类的 reverse() 方法,例如:
String str = "hello world"; System.out.println(StringUtils.reverse(str));
源码实现如下:
public static String reverse(final String str) {
if (str == null) {
return null;
}
return new StringBuilder(str).reverse().toString();
}可以看到,还是通过调用 StringBuilder 的 reverse() 方法来实现的。