考虑以下代码片段:
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
?是否有情况下会自动装箱成引用类型,从而执行引用标识比较?(然后全部都是false
!)