Как хранится int в памяти в Java
Что проверяют
Понимаете ли вы разницу между представлением числа и местом, где оно лежит, и не путаете ли int с Integer. Следом обычно спрашивают, что будет при Integer.MAX_VALUE + 1 или почему Integer a = 128, b = 128; a == b даёт false.
Как отвечать
Разделите ответ на две части.
Представление. int это 32-битное знаковое целое в дополнительном коде, размер зафиксирован спецификацией и не зависит от платформы. Диапазон от -2147483648 до 2147483647. Переполнение не бросает исключение, значение молча переходит через границу: Integer.MAX_VALUE + 1 равно Integer.MIN_VALUE. Если это недопустимо, есть Math.addExact и Math.multiplyExact, которые бросают ArithmeticException.
Место хранения зависит от того, чем является переменная:
- локальная переменная или параметр: в кадре метода на стеке потока, занимает один слот. После JIT-компиляции значение чаще всего живёт в регистре процессора;
- поле объекта: внутри самого объекта в куче, 4 байта рядом с другими полями. Объект при этом несёт заголовок: на 64-битном HotSpot со сжатыми указателями это 12 байт, а общий размер выравнивается до 8;
- статическое поле: хранится вместе с данными класса, в современных HotSpot тоже в куче;
- элемент массива
int: массив лежит в куче одним непрерывным блоком по 4 байта на элемент плюс заголовок с длиной.
Для контраста Integer: отдельный объект в куче примерно на 16 байт плюс ссылка на него. Integer.valueOf и автоупаковка берут готовые объекты из кеша для значений от -128 до 127, остальные создаются заново.
Порядок байтов в памяти задаёт процессор, на x86 и ARM это little-endian. В class-файлах и в DataOutputStream порядок big-endian, как и по умолчанию у ByteBuffer.
Где спотыкаются
Говорят «примитивы всегда на стеке». Поле int у объекта лежит в куче вместе с объектом.
Сравнивают Integer через ==. На маленьких числах это работает благодаря кешу, а на 128 и выше внезапно даёт false.
Не помнят про переполнение. Классика: Math.abs(Integer.MIN_VALUE) возвращает отрицательное число, а сумма двух больших int при подсчёте середины массива уходит в минус.