在Java中反转String的最有效算法是什么?

Hul*_*ner 35 java string algorithm performance

在Java中反转字符串的最有效方法是什么?我应该使用某种xor运算符吗?简单的方法是将所有字符放在堆栈中并将它们重新放回字符串中,但我怀疑这是一种非常有效的方法.

请不要告诉我在Java中使用一些内置函数.我有兴趣学习如何不使用有效的功能,但不知道为什么它有效或如何建立.

Tom*_*Tom 50

你说你想知道最有效的方式,你不想知道一些标准的内置方式.然后我告诉你:RTSL(读源,luke):

查看AbstractStringBuilder #verse的源代码,它由StringBuilder#reverse调用.我打赌它会做一些你不会考虑进行强大的反向操作的东西.

  • 链接似乎坏了 (6认同)
  • +1链接到源.学习如何实现某些东西的最好方法之一就是看看它是如何在现实世界中完成的. (2认同)

Sim*_*son 37

以下不涉及UTF-16代理对.

public static String reverse(String orig)
{
    char[] s = orig.toCharArray();
    int n = s.length;
    int halfLength = n / 2;
    for (int i=0; i<halfLength; i++)
    {
        char temp = s[i];
        s[i] = s[n-1-i];
        s[n-1-i] = temp;
    }
    return new String(s);
}
Run Code Online (Sandbox Code Playgroud)

  • @theGreenCabbage他只是将最后一个元素与第一个元素交换,然后将第二个最后一个元素与第二个交换,依此类推,直到到达中间元素为止。 (2认同)

Mar*_*ers 20

你说你不想这么简单,但对于那些谷歌搜索你应该使用StringBuilder.reverse:

String reversed = new StringBuilder(s).reverse().toString();
Run Code Online (Sandbox Code Playgroud)

如果您需要自己实现它,那么以相反的顺序迭代字符并将它们附加到StringBuilder.如果有(或可以)代理对,你必须要小心,因为这些不应该被颠倒.上面显示的方法会自动为您执行此操作,这就是您应该尽可能使用它的原因.

  • 如果你不需要线程安全,首选`StringBuilder`到`StringBuffer`. (5认同)

小智 8

然而,旧的帖子和问题仍然没有看到与递归有关的答案.递归方法反转给定的字符串s,而不中继内置的jdk函数

    public static String reverse(String s) {
    if (s.length() <= 1) {
        return s;
    }
    return reverse(s.substring(1)) + s.charAt(0);
}
Run Code Online (Sandbox Code Playgroud)

`


rsp*_*rsp 5

最快的reverse()方法是在StringBuilderStringBuffer类上使用方法:)

如果你想自己实现它,你可以得到字符数组,分配第二个字符数组并移动字符,在伪代码中这将是:

String reverse(String str) {
    char[] c = str.getCharArray
    char[] r = new char[c.length];
    int    end = c.length - 1

    for (int n = 0; n <= end; n++) {
        r[n] = c[end - n];
    }

    return new String(r);
}
Run Code Online (Sandbox Code Playgroud)

你也可以运行一半的数组长度并交换字符,检查可能会减慢速度.