Рассмотрим следующий фрагмент:
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
объект будет НИКОГДА не будет ==
к уже существующему объекту.
Вопрос касается первых 3 строк: гарантируется ли те сравнения *1017* на примитиве int
при автоматическом распаковывании Integer
? Существуют ли случаи, когда примитив вместо этого будет автоматически упакован, и будет проведено сравнение эталонных идентификаторов? (что все тогда будет false
!)