String
не позволяет добавлять. Каждый метод, который вы вызываете на String
, создает новый объект и возвращает его. Это потому, что String
является неизменным - он не может изменить свое внутреннее состояние.
С другой стороны, StringBuilder
является изменчивым. Когда вы вызываете append(..)
, он изменяет внутренний массив символов вместо создания нового строкового объекта.
Таким образом, более эффективно иметь:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 500; i ++) {
sb.append(i);
}
вместо str += i
, что создаст 500 новых строковых объектов.
Обратите внимание, что в примере я использую цикл. Как замечает гелиос в комментариях, компилятор автоматически переводит выражения вроде String d = a + b + c
во что-то вроде
String d = new StringBuilder(a).append(b).append(c).toString();
Обратите внимание, что есть StringBuffer
в дополнение к StringBuilder
. Разница в том, что у первых есть синхронизированные методы. Если вы используете его как локальную переменную, используйте StringBuilder
. Если случается, что к нему могут обращаться несколько потоков, используйте StringBuffer
(это реже)