Java StringBuilder огромные накладные расходы - PullRequest
0 голосов
/ 10 ноября 2009

Я где-то читал, что Java StringBuilder использует около 1 МБ для 500 символов. Это правда, и если да, то не слишком ли это экстремально? Делает ли StringBuilder невероятные вещи с таким объемом памяти? В чем причина и означает ли это, что я не должен слишком много использовать этот класс?

Ответы [ 5 ]

13 голосов
/ 10 ноября 2009

Нет, это полная чушь - если, конечно, вы не создадите StringBuilder с гигантскими возможностями.

Java обычно использует 2 байта на символ. В String и StringBuilder есть небольшие издержки для длины и самого массива, но не много.

Теперь 1K на 500 символов - это почти правильно ... Я подозреваю, что это стало причиной путаницы. (Либо вы не слышали, либо человек, разговаривающий с вами, повторял что-то , они бы не слышали.)

2 голосов
/ 10 ноября 2009

Я видел два случая, когда StringBuilder, как правило, используют большие объемы памяти:

  • Когда StringBuilder создается с безумной начальной емкостью.
  • StringBuilder, которые были "кэшированы", чтобы "сохранить" время выделения объектов.

Так что во втором случае StringBuilder может потреблять 1 Мб памяти, если какой-то код, который ранее использовал SB, хранил в нем очень большую строку. Это потому, что он будет только расти, но не уменьшать свой внутренний массив символов.

Оба случая можно (и нужно) легко избежать.

0 голосов
/ 05 мая 2017

Я думаю, что StringBuilder - лучший выбор для использования.Это быстрее и безопаснее тоже.Это зависит от сценария.Если у вас есть строковый литерал, который не меняется часто, я бы сказал, что String - лучший выбор, потому что он неизменен, иначе StringBuilder прямо здесь.Теперь о том месте, о котором вы говорите, я нигде не слышал.

0 голосов
/ 10 ноября 2009

Из-за удвоения перераспределения 2К на 500 символов тоже будет правильным, но не более. Вот похожий вопрос .

0 голосов
/ 10 ноября 2009

Эта информация ошибочна, вы помните, каков был источник этой информации? Если это так, вы должны исправить это. Java обычно использует 2 байта на символ.

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