Скорость вопроса при добавлении строк - PullRequest
6 голосов
/ 13 января 2010

Всякий раз, когда я пытаюсь добавить числа в строку как:

String s=new String();

 for(int j=0;j<=1000000;j++)

    s+=String.valueOf(j);

Моя программа добавляет цифры, но очень медленно. Но когда я изменил свою программу и сделал ее такой:

StringBuffer sb=new StringBuffer();

for(int j=0;j<=1000000;j++)

sb.append(String.valueOf(j));

Я получил результат очень быстро. Почему это так?

Ответы [ 4 ]

6 голосов
/ 13 января 2010

s+=String.valueOf(j); необходимо выделять новый String объект каждый раз, когда он вызывается, и это дорого. StringBuffer нужно только увеличить некоторое внутреннее представление, когда содержащаяся строка слишком велика, что происходит гораздо реже.

Вероятно, было бы еще быстрее, если бы вы использовали StringBuilder, который является несинхронизированной версией StringBuffer.

Следует отметить, что хотя это относится к циклам и многим другим случаям, это не обязательно относится ко всем случаям, когда строки объединяются с использованием +:

String helloWorld = getGreeting() + ", " + getUsername() + "!";

Здесь компилятор, вероятно, оптимизирует код так, как считает нужным, что может создавать или не создавать StringBuilder, поскольку это также дорогостоящая операция.

1 голос
/ 13 января 2010

Взгляните на это из рассылки Javaspecialists Heinz Kabutz:

http://www.javaspecialists.eu/archive/Issue068.html

и эта более поздняя статья:

http://java.sun.com/developer/technicalArticles/Interviews/community/kabutz_qa.html

1 голос
/ 13 января 2010

В Java, как и в .NET, строки являются неизменяемыми. Они не могут быть изменены после создания. В результате использование оператора + создаст новую строку и скопирует в нее содержимое обеих строк.

StringBuffer удваивает выделенное пространство каждый раз, когда ему не хватает места для добавления символов. Таким образом сокращается объем выделенной памяти.

1 голос
/ 13 января 2010

Потому что s + = "строка" создает новый экземпляр. Строка неизменна. StringBuffer или StringBuilder добавляет String без создания нового экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...