不使用StringBuffer.reverse()的反向字符串

时间:2014-01-27 19:12:13

标签: java garbage-collection stringbuffer

以下示例中的问题是什么?如果字符串中的数百万字符被反转,会发生什么?

public static String reverseUsingStringBuffer(String source) {
    if(source == null || source.isEmpty()){
        return source;
    }       
    StringBuffer reverse = new StringBuffer();

    for(int i = source.length() -1; i>=0; i--){
        reverse.append(source.charAt(i));
    }

    return reverse.toString();
}

遵循更好的方法吗? (旁边使用api方法)。巨大的String的好方法是什么?

public static String reverse(String source) {
    if(source == null || source.isEmpty()){
        return source;
    }       
    String reverse = "";
    for(int i = source.length() -1; i>=0; i--){
        reverse = reverse + source.charAt(i);
    }

    return reverse;
}

5 个答案:

答案 0 :(得分:3)

如前所述,String方法非常糟糕。使用StringBuffer要好得多,但是当StringBuilder能够更快地完成同样的操作时,这个相当过时的类没有理由。

在这种情况下,更简单,更快速的是使用数组:

char[] result = new char[source.length];
for(int i = 0; i < source.length(); ++i) result[source.length() - 1 - i] = source.charAt(i);
return new String(result);

除了char[]之外,它根本不分配任何垃圾......但是这是不可避免的,因为String是不可变的,共享构造函数是包私有的(有充分理由)。

请注意,通常绝对没有必要对此进行优化。

答案 1 :(得分:0)

不,第一种方法更好,因为它会在内部为您管理缓冲区。不要试图超越编译器。为什么不将整个源附加到一行,这将正确分配缓冲区。

答案 2 :(得分:0)

第一个。在第二个中,使用“string = string + string”,每次使用“+”时都会创建一个对象。我会使用StringBuffer。

答案 3 :(得分:0)

第一种方法更好,StringBuffer是可变的并且使用string = string + string降低性能。

答案 4 :(得分:0)

您也可以将它制作到位。

public static String reverse(String s) {
   char[] chars = s.toCharArray();
   for(int i = 0, j = chars.length - 1; i < chars.length / 2; i++, j--) {
     char c = chars[i];
     chars[i] = chars[j];
     chars[j] = c;
   }
   return new String(chars);
}