我读了一本书并写道:
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();
}
我的问题是,为什么此反向字符串代码的第二个版本更好?
答案 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个字符串。