Java面试题:如何将字符串反转?

本文将介绍在 Java 中怎样快速将字符串反转。

使用 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

// StringBuilder.java
@Override
public StringBuilder reverse() {
    // 调用超类 AbstractStringBuilder 的 reverse() 方法
    super.reverse();
    return this;
}

StringBuffer

StringBuffer 的 reverse() 方法源码如下:

// StringBuffer.java
@Override
public synchronized StringBuffer reverse() {
    toStringCache = null;
    // 调用超类 AbstractStringBuilder 的 reverse() 方法
    super.reverse();
    return this;
}

AbstractStringBuilder

// 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

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

学习从来无捷径,循序渐进登高峰。 —— 高永祚
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号