以下示例中的问题是什么?如果字符串中的数百万字符被反转,会发生什么?
public static String reverseUsingStringBuffer(String source) {
if(source == null || source.isEmpty()){
return source;
}
StringBuffer reverse = new StringBuffer();
for(int i = source.length() -1; i>=0; i--){
reverse.append(source.charAt(i));
}
return reverse.toString();
}
遵循更好的方法吗? (旁边使用api方法)。巨大的String的好方法是什么?
public static String reverse(String source) {
if(source == null || source.isEmpty()){
return source;
}
String reverse = "";
for(int i = source.length() -1; i>=0; i--){
reverse = reverse + source.charAt(i);
}
return reverse;
}
答案 0 :(得分:3)
如前所述,String
方法非常糟糕。使用StringBuffer
要好得多,但是当StringBuilder
能够更快地完成同样的操作时,这个相当过时的类没有理由。
在这种情况下,更简单,更快速的是使用数组:
char[] result = new char[source.length];
for(int i = 0; i < source.length(); ++i) result[source.length() - 1 - i] = source.charAt(i);
return new String(result);
除了char[]
之外,它根本不分配任何垃圾......但是这是不可避免的,因为String是不可变的,共享构造函数是包私有的(有充分理由)。
请注意,通常绝对没有必要对此进行优化。
答案 1 :(得分:0)
不,第一种方法更好,因为它会在内部为您管理缓冲区。不要试图超越编译器。为什么不将整个源附加到一行,这将正确分配缓冲区。
答案 2 :(得分:0)
第一个。在第二个中,使用“string = string + string”,每次使用“+”时都会创建一个对象。我会使用StringBuffer。
答案 3 :(得分:0)
第一种方法更好,StringBuffer是可变的并且使用string = string + string降低性能。
答案 4 :(得分:0)
您也可以将它制作到位。
public static String reverse(String s) {
char[] chars = s.toCharArray();
for(int i = 0, j = chars.length - 1; i < chars.length / 2; i++, j--) {
char c = chars[i];
chars[i] = chars[j];
chars[j] = c;
}
return new String(chars);
}