Наиболее эффективный способ заполнить строку указанной длины с указанным символом? - PullRequest
0 голосов
/ 29 августа 2011

В основном, учитывая int, мне нужно сгенерировать строку той же длины, содержащую только указанный символ. Смежный вопрос здесь , но он относится к C # и имеет значение , что находится в строке.

Этот вопрос , и мой ответ на него - вот почему я задаю этот вопрос. Я не уверен, что лучший способ сделать это с точки зрения производительности.

Пример

Подпись метода:

String getPattern(int length, char character);

Использование:

//returns "zzzzzz"
getPattern(6, 'z');

Что я пробовал

String getPattern(int length, char character) {
    String result = "";
    for (int i = 0; i < length; i++) {
        result += character;
    }
    return result;
}

Это лучшее, что я могу сделать с точки зрения производительности?

Ответы [ 7 ]

6 голосов
/ 29 августа 2011

Вы должны использовать StringBuilder вместо объединения символов таким образом.Использование StringBuilder.append () .

StringBuilder даст вам лучшую производительность.Проблема конкатенации, которую вы делаете, заключается в том, что каждый раз, когда создается новая строка (строка неизменна), затем копируется старая строка, добавляется новая строка, а старая строка выбрасывается.Это большая дополнительная работа, которая за период типа (как в большом цикле for) приведет к снижению производительности.

5 голосов
/ 29 августа 2011

StringUtils от commons-lang или Strings от guava - ваши друзья.Как уже говорилось избегайте конкатенации строк.

StringUtils.repeat("a", 3) // => "aaa"
Strings.repeat("hey", 3) // => "heyheyhey"
4 голосов
/ 29 августа 2011

Используйте примитивные массивы символов и некоторые стандартные классы утилит, такие как Массивы

public class Test {
    static String getPattern(int length, char character) {
        char[] cArray = new char[length];
        Arrays.fill(cArray, character);
//      return Arrays.toString(cArray);
        return new String(cArray);
    }

static String buildPattern(int length, char character) {
    StringBuilder sb= new StringBuilder(length);
    for (int i = 0; i < length; i++) {
        sb.append(character);
    }
    return sb.toString();
}

public static void main(String args[]){
    long time = System.currentTimeMillis();
    getPattern(10000000,'c');
    time = System.currentTimeMillis() - time;
    System.out.println(time);           //prints 93
    time = System.currentTimeMillis();
    buildPattern(10000000,'c');
    time = System.currentTimeMillis() - time;
    System.out.println(time);          //prints 188
}

}

РЕДАКТИРОВАТЬ Arrays.toString () дал меньшепроизводительность, так как он в конечном итоге использовал StringBuilder, но новая String сделала волшебство.

3 голосов
/ 29 августа 2011

Yikes, нет.

A String является неизменным в Java;ты не можешь это изменить.Когда вы говорите:

result += character;

Вы создаете новый String каждый раз.

Вы хотите использовать StringBuilder и добавить к нему, затем вернуть Stringс его toString() методом.

2 голосов
/ 29 августа 2011

Я думаю, что было бы эффективнее сделать это следующим образом,

String getPattern(int length, char character) 
        {
            char[] list = new char[length];
            for(int i =0;i<length;i++)
            {
                list[i] = character;
            }
            return new string(list);
        }
1 голос
/ 29 августа 2011

С точки зрения производительности, я думаю, что у вас будут лучшие результаты, если вы создадите небольшую String и объедините ее (используя, конечно, StringBuilder), пока не достигнете размера запроса: объединение / добавление "zzz" к "zzz" выполняет, вероятно,лучше, чем конкатенация «z» три раза (ну, может быть, не для таких небольших чисел, но когда вы достигнете 100 или около того символов, выполнение десяти конкатенаций «z» с последующими десятью конкатенациями «zzzzzzzzzz», вероятно, лучше, чем 100 конкатенаций из 'z ').

Кроме того, поскольку вы спрашиваете о GWT, результаты будут сильно различаться между DevMode (чистая Java) и «производственным режимом» (запущенным в JS в браузере) и, вероятно, будут различаться в зависимости отбраузер.

Единственный способ узнать это - это сравнительный анализ, все остальное - чистая спекуляция.
И, возможно, использование отложенной привязки для использования наиболее эффективного варианта в каждом браузере (именно так StringBuilderэмулируется в GWT).

1 голос
/ 29 августа 2011

Объединение строки никогда не бывает наиболее эффективным, поскольку String является неизменяемым, для повышения производительности следует использовать StringBuilder и append ()

String getPattern(int length, char character) {
    StringBuilder sb= new StringBuilder(length)
    for (int i = 0; i < length; i++) {
        sb.append(character);
    }
    return sb.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...