Примитивные типы против. Упакованные примитивные типы
Основные различия
Идентичность против. Ценить:
Примитивы: У них нет идентичности; два примитива с одинаковым значением всегда равны.
Упаковано: Они являются объектами и имеют идентичность; два объекта могут иметь одно и то же значение, но разные идентификаторы.
Нулевые значения:
Примитивы: Всегда имеют значение по умолчанию (например, 0 для целого числа).
Упаковано: Может иметь значение null, что может привести к исключению NullPointerException, если оно не будет обработано должным образом.
Производительность:
Примитивы: Более эффективно с точки зрения времени и пространства.
Упаковано: Внедряются накладные расходы из-за создания дополнительных объектов.
Распространенные проблемы при смешивании примитивов и пакетов
Проблемный пример:
ComparatornaturalOrder = (i, j) -> (i Проблема: Сравнение i == j сравнивает ссылки, а не значения.
Неверное поведение: naturalOrder.compare(new Integer(42), new Integer(42)) возвращает 1 вместо 0.Решение:
Используйте метод CompareTo или служебные методы класса Integer.ComparatornaturalOrder = Integer::compare; Или, исправив исходный компаратор:
ComparatornaturalOrder = (iBoxed, jBoxed) -> { int i = iBoxed; int j = jBoxed; return (i 2. Автораспаковка и исключение NullPointerException
При использовании упакованных типов, которые могут иметь значение NULL, автораспаковка может вызывать исключения, если объект имеет значение NULL.Проблемный пример:
Integer i = null; if (i == 42) { System.out.println("Inacreditável"); }Проблема: i равно нулю; при сравнении с 42 происходит автоматическая распаковка null, что приводит к исключению NullPointerException.
Решение: По возможности используйте примитивные типы.int i = 0; if (i == 42) { System.out.println("Inacreditável"); }3. Снижение производительности из-за автобокса/распаковки
Непреднамеренное использование обернутых типов в интенсивных операциях может привести к снижению производительности из-за автоупаковки и создания ненужных объектов.Проблемный пример:
Long sum = 0L; for (long i = 0; iПроблема: сумма представляет собой упакованный длинный элемент; на каждой итерации происходит автоупаковка/распаковка.
Влияние: значительно более медленный код и чрезмерное использование памяти.
Решение:
Используйте примитивные типы для локальных переменных в интенсивных операциях.long sum = 0L; for (long i = 0; iКогда использовать упакованные типы
- Коллекции: нельзя использовать примитивные типы в универсальных коллекциях (например, List).
- Общие параметры: универсальные типы не поддерживают примитивные типы (например, ThreadLocal).
- API, требующие объекты: для некоторых API требуются объекты, а не примитивные типы.
Передовая практика
- Предпочитайте примитивные типы: по возможности используйте примитивные типы для простоты и эффективности.
- Остерегайтесь автобоксинга/распаковки: автобокс снижает количество подробностей, но может привести к незначительным ошибкам.
- Избегайте сравнений с == в обертке: используйте такие методы, как равные(), или сравнивайте развернутые значения.
- Проверьте наличие значений NULL: при работе с упакованными типами имейте в виду, что они могут иметь значение NULL и вызывать исключение NullPointerException.
Краткое содержание
Примитивные типы:
Проще и быстрее.
Они не могут быть нулевыми.
У них нет идентичности (только значение).Типы упаковки:
Требуется для использования в коллекциях и универсальных API.
Они могут быть нулевыми.
У них есть идентичность объекта.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3