为什么一个代码比另一个代码更好? (字符串对象)

时间:2018-11-22 13:42:36

标签: java arrays string performance

我读了一本书并写道:

public static String reverse( String in ) {
    String out = "";
    for ( int i = in.length() - 1; i >= 0; --i ) {
        out += in.charAt( i );
    }
    return out;
}

它可以工作,但这更好:

public static String reverse( String in ) {
    int len = in.length();
    StringBuilder out = new StringBuilder( len );
    for ( int i = len - 1; i >= 0; --i ) {
        out.append( in.charAt( i ) );
    }
    return out.toString();
}

我的问题是,为什么此反向字符串代码的第二个版本更好?

4 个答案:

答案 0 :(得分:2)

String是不可变的类型。这意味着您对String对象执行的任何操作都不会影响原始对象,而是会创建另一个对象。 StringBuilder是一个可变的类,因此避免了在JVM中创建太多对象。

答案 1 :(得分:1)

String是不可变的,而StringBuilder是不可变的。在out += in.charAt( i );的第一个代码中,每次执行时都会新创建String对象。但在第二种情况下,字符被追加到先前的String。因此,在这样的实习生中,您可以说第二个更好。

答案 2 :(得分:-1)

因为String是不可变的,所以当您连接这样的字符串时:

public static String reverse( String in ) {
    String out = "";
    for ( int i = in.length() - 1; i >= 0; --i ) {
        out += in.charAt( i );
    }
    return out;
}

每次使用+时,您都在创建一个新的String,因此在上面的示例中,您正在创建in.length个不同的String。另一方面,StringBuilder不会这样做,并且在您调用build()时会创建单个String。

答案 3 :(得分:-3)

这是因为第一个解决方案最终将在stringliteral池中创建n(n + 1)个字符串,而后一个解决方案将最多创建2个字符串。