В чем разница между Int и Int? в Kotlin и когда Int рассматривается как объект, а когда как примитив
Что проверяют
Понимаете ли вы, что в исходнике Kotlin примитивов нет, а решение «примитив или объект» принимает компилятор при генерации байткода. Следом почти всегда спрашивают, почему === для двух одинаковых Int? иногда даёт false.
Как отвечать
Начните с системы типов: Int не может быть null, Int? может. На JVM это превращается в разное представление:
Int: компилируется в примитивныйintвезде, где это возможно: поля, параметры, локальные переменные, возвращаемые значения;Int?: всегдаjava.lang.Integer, потому что примитив не умеет хранитьnull;- дженерики:
List<Int>,Map<Int, String>, параметр типаTработают только со ссылками, поэтому значения упаковываются, даже если объявлены какInt; Anyи интерфейсы: при передачеIntтуда, где ждутAnyилиComparable<Int>, значение тоже упаковывается;- массивы:
IntArrayэтоint[], аArray<Int>этоInteger[]с упаковкой каждого элемента.
Упаковка стоит аллокации и косвенного обращения к памяти. Для одиночных значений это мелочь, для горячих циклов и больших коллекций уже заметно. На Android отсюда растут SparseIntArray вместо HashMap<Int, Int> и mutableIntStateOf вместо mutableStateOf<Int> в Compose: оба существуют ради того, чтобы не упаковывать числа.
Отдельно про равенство. == сравнивает значения и работает всегда. === для упакованных чисел сравнивает ссылки, а JVM кеширует Integer в диапазоне от -128 до 127. Если a и b типа Int? получены из одного и того же числа 127, a === b даст true, а для 10000 уже false. Поэтому === для чисел не используют вовсе.
Где спотыкаются
Говорят, что Int «всегда примитив, а Int? всегда объект», и забывают про дженерики. val list: List<Int> хранит объекты, хотя знака вопроса нигде нет.
Переносят в Kotlin картину из Java и начинают рассуждать про Integer в исходниках. В Kotlin тип один, разница появляется только после компиляции.
Предлагают Array<Int> для большого массива чисел. Правильный выбор IntArray, иначе вы платите за объект на каждый элемент и за лишнюю работу сборщика мусора.