为什么一个代码更好的另一个代码? (字符串对象)[重复]

问题描述 投票:-2回答:4

这个问题在这里已有答案:

我读了一本书写道:

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

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

java arrays string performance
4个回答
1
投票

String是不可变的,StringBuilder不是一成不变的。在out += in.charAt( i );的第一个代码中,每次执行时都会新创建String对象。但在第二种情况下,字符附加到前一个字符串。所以,在这样的燕鸥中你可以说第二个更好。


2
投票

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


-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不同的字符串。另一方面,当你调用StringBuilder时,build()不会那样做并创建一个String。


-3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.