java - 不使用 StringBuffer.reverse() 反转字符串

标签 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 方法)。对于巨大的字符串有什么好方法?

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;
}

最佳答案

正如已经说过的,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 是不可变的,并且共享构造函数是包私有(private)的(有充分的理由)。

请注意,通常完全没有必要进行如此严格的优化。

关于java - 不使用 StringBuffer.reverse() 反转字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21389559/

相关文章:

Java 程序输出应该是 true ,但它返回 false 为什么?

java - Cordova 插件 (java) 通知不会转到应用程序 - android

java - 将列表的第一个元素输入数组的最快方法

java - 使代码可测试的首选方法:依赖注入(inject)与封装

java - HashMap 与 WeakHashMap 一起被垃圾收集?

java - 从文件中提取多个 xml 标记之间的数据的最佳方法

java - Java构造函数中的StringBuffer?

java - 如何解决: java. io.IOException: Stream closed

memory-management - MATLAB 的垃圾收集器?

ios - iOS 中不允许私有(private) API 调用(函数 "exc_server")