Рассмотрим следующий фрагмент:
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
!)