哪种方法更好,并在以下两种方法之间进行优化?

时间:2013-02-13 09:10:41

标签: java

以下是使用调用API方法反转字符串的两种方法。请告诉我哪种方法更合理

public String functionOne(String str){
    char arr[] = str.toCharArray();
    int limit = arr.length/2;
    for (int i = arr.length-1, j = 0; j < limit; i--, j++) {
        char c = arr[i];
        arr[i] = arr[j];
        arr[j] = c;
    }
    return new String(arr);
}

public String functionTwo(String str) {
    StringBuilder strBuilder = new StringBuilder();
    char[] strChars = str.toCharArray();

    for (int i = strChars.length - 1; i >= 0; i--) {
        strBuilder.append(strChars[i]);
    }

    return strBuilder.toString();
}

实际上,当我在长度为100000的字符串上运行我的代码时,第二次接近第二次接近的时间。通过使用System.currentTimeMillis(),我发现第一种方法的执行差异为1,第二种方法的执行差异为2。

3 个答案:

答案 0 :(得分:6)

这个怎么样:

new StringBuilder("some string").reverse().toString();

现有的API可能会以最有效的方式使用。

答案 1 :(得分:1)

两者都是一样的。首先使用n/2 O(n)操作,第二个操作是n操作,这也是O(n)时间复杂度。

在实践中,两者都会运行得非常好,因为nn/2操作不会产生太大影响。

编辑:如果您没有获得时间复杂度的含义,请尝试生成一个长度为100万的随机字符串并计算两种方法的时间。

答案 2 :(得分:1)

第二个更具可读性:我可以浏览它,而不必考虑它在做什么。我每次都会这样做(除非有一个很好的理由为什么你需要它快几毫秒?)

第一个停止我的大脑几秒钟。这意味着它很危险,很容易被未来的变化打破。它需要注释或替换(使用第二个)。