Характеристика | Примитивные типы | Объекты (ссылочные типы) |
---|---|---|
Хранение значения | Непосредственно в переменной | Ссылка на область в памяти (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 байт у int
Null-safety:
null
fun 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, версия языка) при ответе на этот вопрос, так как поведение может отличаться.