middle
Оцените количество памяти на хранение одного примитива типа byte в ArrayList
ArrayList хранит ссылки в массиве, а примитив byte упаковывается в объект Byte.
Для x32 JVM:
- Ссылка в массиве: 4 байта
- Byte: заголовок 8 байт + 1 байт данных = 16 байт (с padding)
- Итого: 4 + 16 = 20 байт
Для x64 JVM:
- Ссылка в массиве: 8 байт (4 байта с CompressedOops)
- Byte: заголовок 16 байт + 1 байт данных = 24 байта (с padding)
- Итого: 8 + 24 = 32 байта (или 4 + 24 = 28 байт с CompressedOops)
Как и в LinkedList, значения от -128 до 127 используют кэшированные экземпляры Byte, поэтому накладные расходы на объект Byte не возникают для каждого элемента. Тем не менее, ArrayList все равно значительно экономнее LinkedList по памяти, т.к. не создает объекты Node.
На собеседовании: сравните с LinkedList: ArrayList расходует ~20 байт (x32) vs ~40 байт у LinkedList. Разница в два раза показывает, почему ArrayList предпочтительнее по памяти.