这个问题在这里已有答案:
我读了一本书写道:
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();
}
我的问题是为什么这个反转字符串代码的第二个版本更好?
String
是不可变的,StringBuilder
不是一成不变的。在out += in.charAt( i );
的第一个代码中,每次执行时都会新创建String对象。但在第二种情况下,字符附加到前一个字符串。所以,在这样的燕鸥中你可以说第二个更好。
String
是一种不可变的类型。这意味着您在String
对象上执行的任何操作都不会影响原始对象,但会创建另一个操作。 StringBuilder
是一个可变类,因此避免在JVM中创建太多对象。
因为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。
这是因为第一个解决方案将最终在stringliteral池中创建n(n + 1)字符串,而后者将最多创建2个字符串。