Ответ 1
Если вы посмотрите на поля в источнике для BigDecimal
то есть:
BigDecimal:
long intCompact +8 bytes
int precision +4 bytes
int scale +4 bytes
String stringCache +?
BigInteger intVal +?
BigInteger:
int bitCount +4 bytes
int bitLength +4 bytes
int firstNonzeroIntNum +4 bytes
int lowestSetBit +4 bytes
int signum +4 bytes
int[] mag +?
Комментарий для stringCache
говорит
Используется для хранения канонического строкового представления, если оно вычислено.
Предполагая, что вы не вызываете .toString()
, он останется нулевым байтом. Следовательно, BigDecimal
- это (8 + 4 + 4) = 16 байт + BigInteger
.
BigInteger
сам по себе равен 4 + 4 + 4 + 4 + 4 = 20 байт + mag
.
20 + 16 дает в общей сложности 36 байтов плюс величину, которая всегда является минимальным количеством битов, необходимых для представления полного целого числа. Для числа n
потребуется log2(n)
битов, которые можно преобразовать в целые числа. Вы должны использовать о:
36 + Ceiling(log2(n)/8.0) bytes
(обратите внимание, что это не включает какие-либо другие издержки дескриптора объекта, как это делает примерная ссылка на строки, но это должно дать вам хорошее общее представление.)