Для размера строки x 2 - строка использует символ для каждого байта (вы можете установить флаг виртуальной машины для использования байта)
-XX:+UseCompressedStrings
Use a byte[] for Strings which can be represented as pure ASCII.
(Introduced in Java 6 Update 21 Performance Release)
Для списка - подсчитать, сколько целых чисел.Для каждого целого числа он создает один указатель на int (4 или 8 байтов в зависимости от платформы - вы можете установить опцию jvm для использования 32-битного адреса на 64-битной машине -XX:+UseCompressedOops
)
Количество целых чисел x ((размеродного целого числа) + (указатель на целое число в списке)) = 2 * (количество целых чисел) * (размер одного указателя)
ByteBuffer - такой же размер, как файл
Лучшее решениеявляется примитивным массивом - байтовым, коротким или целым.Это и есть зависимости целочисленной точности.Для байта у вас есть (число целых) байтов - может быть меньше, чем размер файла.