«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Элемент Предпочитайте примитивные типы упакованным примитивным типам.

Элемент Предпочитайте примитивные типы упакованным примитивным типам.

Опубликовано 11 ноября 2024 г.
Просматривать:399

Item  Dê preferência aos tipos primitivos em vez dos tipos primitivos empacotados

Примитивные типы против. Упакованные примитивные типы

  • Примитивные типы: int, double, boolean и т. д.
  • Упакованные примитивные типы: целые, двойные, логические и т. д.
  • В Java существует двойная система типов: примитивные типы и ссылочные типы (объекты).
  • Каждому примитивному типу соответствует соответствующий класс-оболочка.

Основные различия

  • Идентичность против. Ценить:
    Примитивы: У них нет идентичности; два примитива с одинаковым значением всегда равны.
    Упаковано: Они являются объектами и имеют идентичность; два объекта могут иметь одно и то же значение, но разные идентификаторы.

  • Нулевые значения:
    Примитивы: Всегда имеют значение по умолчанию (например, 0 для целого числа).
    Упаковано: Может иметь значение null, что может привести к исключению NullPointerException, если оно не будет обработано должным образом.

  • Производительность:
    Примитивы: Более эффективно с точки зрения времени и пространства.
    Упаковано: Внедряются накладные расходы из-за создания дополнительных объектов.

Распространенные проблемы при смешивании примитивов и пакетов

  • 1. Идентичность вместо сравнения ценностей
  • При сравнении объектов, упакованных с помощью ==, вы сравниваете ссылки на объекты, а не значения. Это может привести к неожиданным результатам.

Проблемный пример:

Comparator naturalOrder = (i, j) -> (i 



Проблема: Сравнение i == j сравнивает ссылки, а не значения.
Неверное поведение: naturalOrder.compare(new Integer(42), new Integer(42)) возвращает 1 вместо 0.

Решение:
Используйте метод CompareTo или служебные методы класса Integer.

Comparator naturalOrder = Integer::compare;

Или, исправив исходный компаратор:

Comparator naturalOrder = (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.
Они могут быть нулевыми.
У них есть идентичность объекта.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/giselecoder/item-61-de-preferencia-aos-tipos-primitivos-em-vez-dostipos-primitivos-empacotados-34fk?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с Study_golang@163 .comdelete
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3