Ответ
Да, объект String в Java считается относительно тяжеловесным по нескольким причинам:
- Неизменяемость (Immutability): Любая операция, модифицирующая строку (например, конкатенация,
substringдо Java 7u6), создает новый объект в куче. Это может быстро привести к накоплению мусора и нагрузке на GC. - Внутреннее представление: Строка хранит данные в массиве
char[], где каждый символ занимает 2 байта (UTF-16). Для строки"Hello"это 10 байт только на данные, плюс накладные расходы самого объекта и массива. - Накладные расходы объекта: Каждый объект
Stringвключает служебные поля (например,hash,value), заголовок объекта и ссылку на массив символов.
Пример и сравнение:
String result = "";
for (int i = 0; i < 1000; i++) {
result += "a"; // Создается 1000+ новых объектов String!
}
// Лучше использовать StringBuilder для таких операций:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append("a");
}
String efficientResult = sb.toString(); // Создан всего один новый String
Вывод: Для интенсивных манипуляций со строками предпочтительны StringBuilder (непотокобезопасный) или StringBuffer (потокобезопасный).