Обратная строка без использования буфера строк.обратный()


В чем проблема в следующем примере? что произойдет, если миллионы символов в строке будут перевернуты?

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 2

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", и это создает один объект каждый раз, когда вы используете"+". Я бы съел Стрингбуффер.

Первый подход лучше, StringBuffer является изменяемым и использование string = string+string снижает производительность.

Вы также можете сделать это на месте.

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