Обратная строка без использования буфера строк.обратный()
В чем проблема в следующем примере? что произойдет, если миллионы символов в строке будут перевернуты?
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). Каков хороший подход для огромной струны?
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;
}
5 ответов:
Как уже было сказано, подход
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 = string + string", и это создает один объект каждый раз, когда вы используете"+". Я бы съел Стрингбуффер.