2013-04-18 3 views
3

В чем разница между объявлением int как ниже. Какие случаи, костюмы использования различных типовпримитивы против инициализации класса обертки

int i  = 20; 
Integer i = 20; 
Integer i = new Integer(20); 

Обратите внимание: Я вытаращил и обнаружил, что первый собираются создать примитивную int.Second будет осуществлять автоматический бокс и третий собираются создать ссылку в памяти.

Ищу сценарий, который четко объясняет, когда я должен использовать первый, второй и третий вид целочисленного initialization.Does сменяющего использование будет иметь какую-либо производительность хиты

Спасибо за ответ.

+2

связанный: [Когда использовать класс-оболочку и примитивный тип] (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). –

ответ

6

Инициализация в первом случае представляет собой простое назначение постоянного значения. Ничего интересного ... кроме того, что это примитивное значение, которое присваивается, а примитивные значения не имеют «идентичности»; то есть все «копии» значения int20 являются одинаковыми.

Второй и третий случаи немного интереснее. Вторая форма использует «бокс», а на самом деле эквивалентно следующему:

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) уменьшает объем размещения объектов для небольших значений и является целесообразной оптимизацией.
+0

Хорошо сказано Спасибо за ответ –

+0

Целое я это равно int i в терминах творения? Будет ли Integer I не создано в куче памяти? Поскольку у меня есть Short s = 20, и когда я сравниваю Integer I == Short s, он выдаст ошибку времени компиляции, но когда его int i == Short s будет true !!!!! @Stephen C – Gpar

+0

@Gpar - 1) Неясно, что вы просите 2) Неясно, что вы просите. 3) Это не вопрос. –

1

Один из таких сценариев, о которых я могу думать, - это когда вы сопоставляете типы БД в Hibernate. Если вы используете Integer, вы можете проверить значение null (при условии, что столбец допускает значения null). Если вы используете примитив, и если значение null в базе данных, я предполагаю, что оно вызывает ошибку.

3

Примитивы будут принимать значения по умолчанию при объявлении без назначения.

Но классы-оболочки являются ссылочными типами, поэтому без назначения они будут null. Это может привести к выбросу NullPointerException при использовании без назначения.

Смежные вопросы