Почему объекты Integer не распаковываются по сравнению с оператором `==`?

Потому что иногда это сбивает с толку. Скажем:

Integer start=new Integer(10);
Integer mid=new Integer(10);
Integer end=new Integer(20);
System.out.println(start<end); // gives true
System.out.println(start!=end); // gives true
System.out.println(start==mid); // BAM! gives false

Объекты распаковываются в первых двух строках, но последняя работает так же, она сравнивает ссылку. Разве это не должно распаковывать объекты тоже. Это только упростило бы ситуацию (правильно?), или я что-то упустил?


person Kanwaljeet Singh    schedule 09.08.2014    source источник
comment
Я думаю, что второй тоже не распаковывается. Я думаю, это тест на эталонное неравенство.   -  person recursive    schedule 10.08.2014


Ответы (4)


В Java 1.4 не было распаковки и поэтому можно было написать

Integer x = new Integer (10);
Integer y = new Integer (10);
System.out.println(x == y); // false;
System.out.println(x != y); // true;

И поэтому, когда они добавили упаковку и распаковку, этот код должен был работать одинаково, иначе они нарушили бы обратную совместимость.

person Peter Lawrey    schedule 09.08.2014


Вы просто сравниваете ссылки на свои целочисленные объекты как >dasblinkenlight уже описано.

Для правильного сравнения целых чисел вам нужно использовать equals, compareTo или привести их к их примитивам с помощью (int) или вызвать intValue(), по крайней мере, для Integer-Object, который вы сравниваете.

person duffy356    schedule 09.08.2014

У вас есть три разные ссылки на объекты (начало, середина и конец) с тремя разными объектами String в куче. Два из них с одинаковым значением. Если вы назначаете одну ссылку другой, сравнение верно (два объекта ссылки с одним и тем же объектом String в куче)

Integer start = new Integer(10);
Integer mid = start; 
System.out.println(start==mid); //  gives true
person Jorge AR    schedule 09.08.2014