Рассмотрим следующий фрагмент:
int i = 99999999;
byte b = 99;
short s = 9999;
Integer ii = Integer.valueOf(9); // should be within cache
System.out.println(new Integer(i) == i); // "true"
System.out.println(new Integer(b) == b); // "true"
System.out.println(new Integer(s) == s); // "true"
System.out.println(new Integer(ii) == ii); // "false"
Очевидно, что последняя строка будет ВСЕГДА печатать "false": мы используем сопоставление сравнения ссылок ==, а объект new будет НИКОГДА == к уже существующему объекту.
Вопрос о первых трех строках: эти сравнения гарантированы, чтобы быть на примитиве int, с Integer auto-unboxed? Существуют ли случаи, когда примитив был бы автоматически помещен в коробку, и выполнялись сравнительные сравнения идентичности? (что тогда было бы тогда false!)