使用 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() 方法来实现的。