Ответ 1
Хранилище строк в Java зависит от того, как была получена строка. Массив char
может использоваться совместно несколькими экземплярами. Если это не так, у вас есть обычная служебная нагрузка и хранение для одного указателя и три int
, которые обычно выводятся на служебные данные на 16 байт. Тогда для поддержки массива требуется 2 байта за char
, так как char
являются кодовыми единицами UTF-16.
Для "Apple Computers"
, где массив подстановки не используется совместно, минимальная стоимость будет
- массив поддержки для 16 символов - 32B, который хорошо выравнивается на границе слова.
- указатель на массив - 4 или 8B в зависимости от платформы
- три
int
для смещения, длины и memoized hashcode - 12B - 2 накладных расходов на объект - зависит от виртуальной машины, но 8B - хорошее эмпирическое правило.
- один
int
для длины массива.
Так примерно 72B, из которых фактическая полезная нагрузка составляет 44,4%. Полезная нагрузка составляет больше для более длинных строк.
В Java7 некоторые реализации JDK устраняют общий доступ к массиву, чтобы избежать закрепления больших char
[] s в памяти. Это позволяет им избавиться от 2 из трех int
s.
Это изменяет вычисление до 64B для строки длиной 16, из которой фактическая полезная нагрузка составляет 50%.