| Характеристика | Примитивные типы | Объекты (ссылочные типы) |
|---|---|---|
| Хранение значения | Непосредственно в переменной | Ссылка на область в памяти (heap) |
| Размер | Фиксированный (зависит от типа) | Зависит от объекта + накладные расходы |
| Инициализация | Всегда имеют значение (не может быть null) | Могут быть null |
| Имена типов | Начинаются с маленькой буквы (int, boolean) | Начинаются с заглавной буквы (String, Integer) |
| Скорость доступа | Быстрее (прямой доступ) | Медленнее (косвенный доступ) |
| Память | Более эффективное использование | Дополнительные overhead |
int primitive = 42; // Хранится в стеке
Integer object = Integer.valueOf(42); // Хранится в heap
Ключевые моменты:
List<Integer> list = new ArrayList<>();
list.add(5); // Автоупаковка int -> Integer
int val = list.get(0); // Распаковка Integer -> int
Kotlin скрывает это различие, но оно остается на уровне JVM:
val a: Int = 123 // Примитив (int в байткоде)
val b: Int? = 456 // Объект (Integer в байткоде)
Производительность:
Пример (оптимизация):
// Плохо (массив объектов):
val array1 = Array<Int>(1000) { it }
// Лучше (массив примитивов):
val array2 = IntArray(1000) { it }
Использование памяти:
Integer занимает ```16 байт против 4 байт у intNull-safety:
nullfun process(value: Int) { ... } // Не принимает null
fun process(value: Int?) { ... } // Принимает null (но это уже объект)
Кэширование оберток:
Integer.valueOf() кэширует значения от -128 до 127Integer a = 127;
Integer b = 127;
a == b; // true (один и тот же кэшированный объект)
Integer c = 128;
Integer d = 128;
c == d; // false (разные объекты)
Android Parcelable:
Parcelable классахРекомендации Android Studio:
SparseArray вместо HashMap<Integer, ?>Совет на собеседовании: Всегда уточняйте контекст (Java/Kotlin, версия языка) при ответе на этот вопрос, так как поведение может отличаться.