在下面的类中,我尝试将包装类与原始类型进行比较,但结果不同。
我已经检查了以下链接links:
更有趣的问题是为什么需要
如果有一个新对象,那么
如果
请解释。
更新: 参考此链接整数缓存。
基本上,Integer类在范围-128到127之间保留了一个Integer实例的缓存,所有自动装箱、字面量和Integer.valueOf()的使用都将返回该缓存中覆盖范围的实例。
因此,在这种情况下,所有语句都应该是真实的。
我已经检查了以下链接links:
更有趣的问题是为什么需要
new Object();
每次创建一个唯一的实例?即为什么new Object();
不能缓存?答案是wait(...)
和notify(...)
调用。缓存新的Object()
会导致线程在不应该同步时错误地与彼此同步。如果有一个新对象,那么
a
和c
如何相等?如果
b
等于c
,c
等于a
,那么a
应该等于b
。但在下面的情况中,我得到了a != c
。请解释。
class WrapperCompare {
public static void main (String args[]) {
Integer a = new Integer(10);
Integer b = 10;
int c=10;
System.out.println(b==c); //true
System.out.println(a==b); //false
System.out.println(a==c); //true
}
}
更新: 参考此链接整数缓存。
基本上,Integer类在范围-128到127之间保留了一个Integer实例的缓存,所有自动装箱、字面量和Integer.valueOf()的使用都将返回该缓存中覆盖范围的实例。
因此,在这种情况下,所有语句都应该是真实的。
valueOf
。 - Zabuzarda==b
外,这里的表达式都不是在比较对象。 - Andy Turnernew
关键字总是返回一个新的实例。只有通过valueOf
(无论是隐式还是显式调用)才会获取缓存的实例。 - Andy TurnerInteger b = 10;
等价于Integer b = Integer.valueOf(10);
(并不是Integer b = new Integer(10);
)。 - Maurice Perry