Инициализация в первом случае представляет собой простое назначение постоянного значения. Ничего интересного ... кроме того, что это примитивное значение, которое присваивается, а примитивные значения не имеют «идентичности»; то есть все «копии» значения int
20
являются одинаковыми.
Второй и третий случаи немного интереснее. Вторая форма использует «бокс», а на самом деле эквивалентно следующему:
Integer i = Integer.valueOf(20);
valueOf
метод может создать новый объект, или он может возвращать ссылку на объект, который существовал ранее. (На самом деле, JLS гарантирует, что valueOf
кэширует Integer
значения для чисел в диапазоне -128 .. + 127 ...)
В отличие от new Integer(20)
всегда создает новый объект.
Эта проблема с новым объектом (или нет) имеет важное значение, если вы привыкли сравнивать объекты-обертки Integer
(или аналогичные) с использованием ==
. В одном случае ==
может быть true
, если вы сравниваете два экземпляра «20». В другом случае гарантируется false
.
Урок: используйте .equals(...)
для сравнения типов обертки не ==
.
На вопрос о том, какие использовать:
- Если
i
является int
, используйте первую форму.
- Если
i
is Integer
, вторая форма является лучшей ...если вы не нуждаетесь в , необходимо указать объект, который является !=
, в другие экземпляры. Бокс (или явно вызывающий valueOf
) уменьшает объем размещения объектов для небольших значений и является целесообразной оптимизацией.
связанный: [Когда использовать класс-оболочку и примитивный тип] (http://stackoverflow.com/questions/1570416/when-to-use-wrapper-class-and-primitive-type), [Что такое бокс и распаковка и какие компромиссы?] (http://stackoverflow.com/questions/13055/what-is-boxing-and-unboxing-and-what-are-the-trade-offs), [Новое целое число vs valueOf] (http://stackoverflow.com/questions/2974561/new-integer-vs-valueof). –