我想知道以下代码是否适用于任何情况?
Object value = attValue.getValue(); // Returns an Object, might contain an Integer
if (value instanceof Integer) {
if (mAccount.getValue() != value) { // mAccount.getValue() return int
// Do something here
}
}
它适用于我的Android工作室,但不适用于其他一些PC。是什么让它对我有用?
答案 0 :(得分:12)
是的,这是完全可行的,因为自动装箱的方式可以保证适用于较小的值,并且允许使用较大的值。例如,保证打印为true:
Object x = 5;
Object y = 5;
System.out.println(x == y);
此可能打印为true,但不保证:
Object x = 10000;
Object y = 10000;
System.out.println(x == y);
我肯定会尽量不依赖于代码,部分是因为虽然保证重用-128到127(包括{-0}}范围内的值,但是有些JVM 可能重用更广泛的值可能会导致您对代码产生错误的安全感。
在你的情况下,我们不知道你是否看到了平台上的差异(还要记住我们谈论的是Android而不是JVM),或者只是当它“工作”了盒装的价值时很小,当它“不起作用”时却不是。
答案 1 :(得分:10)
您获得了相同的Integer
实例,因为Java 5存在Integer Cache。由于该缓存,您获得相同的Integer
引用(您获得相同的Integer
引用,并且因为它们具有相同的引用,所以它们具有引用标识 - 这是什么==
测试)。链接的Integer缓存文档(部分)
整数对象在内部缓存,并通过相同的引用对象重用。
这适用于-127到+127(最大整数值)范围内的整数值。
此整数缓存仅适用于自动装箱。使用构造函数构建整数对象时,它们不会被缓存。