题
public class WrapperTest {
public static void main(String[] args) {
Integer i = 100;
Integer j = 100;
if(i == j)
System.out.println("same");
else
System.out.println("not same");
}
}
上面的代码给出了输出 same
运行时,但是如果我们改变值 i
和 j
到 1000 输出变为 not same
. 。当我正在准备 SCJP 时,需要弄清楚这背后的概念。有人可以解释一下这种行为吗?谢谢。
解决方案
在Java中,-128和127(含)之间的整数,一般由相同的整数对象实例表示。
:这是通过使用称为IntegerCache(载Integer类内部,并且例如当使用时Integer.valueOf()被调用,或自动装箱期间)一个内部类的处理private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
其他提示
-127到127之间基本上整数由以这样的方式,当你使用这些数字,你总是指在内存中相同的号码,这就是“缓存”为什么你的作品==
这范围之外的任何整数不缓存,因此引用是不一样的。
@tunaranch是正确的。这也是与此相同的问题 Python问题. 。要点是,Java 为从 -128 到 127 的整数保留一个对象(Python 为 -5 到 256),并在每次请求时返回相同的对象。如果你要求一个超出这个固定范围的整数,它每次都会给你一个新的对象。
(回想起那个 ==
返回两个对象是否是 实际上 同样,同时 equals
比较它们的内容。)
如果值 p 被装箱是
true
,false
, , Abyte
, , Achar
在范围中\u0000
到\u007f
, ,或-128至127之间的int或短数,然后让 r1 和 r2 成为p的任何两个拳击转换的结果。总是这样 r1 == r2.
请注意,这也描述了其他类型发生的情况。
您的代码不编译。这是我所得到的:
异常在线程“主要” java.lang.Error的:未解决编译问题: 类型不匹配:不能转换从int到整数 类型不匹配:不能从int转换为整数
at WrapperTest.main(WrapperTest.java:5)
变量i和j是整数对象的实例。不使用“==”操作符比较对象的情况下,使用“等于”方法来代替。
问候
不隶属于 StackOverflow