int[] хранит значения плотно, Integer[] — ссылки на отдельные объекты. В цикле new Integer создаёт миллион обёрток за проход, постоянно заменяя предыдущие и увеличивая давление на GC.
Проанализируйте различия в производительности и использовании памяти при использовании int[] и Integer[] в Java, особенно в контексте данного фрагмента кода:
int[] хранит значения плотно, Integer[] — ссылки на отдельные объекты. В цикле new Integer создаёт миллион обёрток за проход, постоянно заменяя предыдущие и увеличивая давление на GC.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Проанализируйте различия в производительности и использовании памяти при использовании int[] и Integer[] в Java, особенно в контексте данного фрагмента кода:
int SIZE = 1000000;
int[] x = new int[SIZE];
Integer[] y = new Integer[SIZE];
for (;;) {
for (int i = 0; i < SIZE; ++i) {
y[i] = new Integer(x[i]);
}
}
Ответ
int[] хранит значения плотно, Integer[] — ссылки на отдельные объекты. В цикле new Integer создаёт миллион обёрток за проход, постоянно заменяя предыдущие и увеличивая давление на GC.
Полезная нагрузка int[1_000_000] занимает 4 000 000 байт плюс заголовок и выравнивание. У Integer[] дополнительно нужны массив ссылок и объекты-обёртки; точный размер зависит от JVM. x изначально заполнен нулями, но new не использует Integer cache как valueOf. Цикл бесконечный и не выводит результат; это плохой benchmark из-за возможных JIT-оптимизаций. Для числовой обработки без null предпочтителен int[].