如果我们有类似以下的表达式,
Integer x=500;
Integer y=500;
System.out.println(x==y);
然后,操作x==y
的结果将是false
,因为我们正在比较对象引用。
如果我对这两个变量x
和y
有一个循环,如下所示,
Integer x=0;
Integer y=0;
for(int i=0;i<2000;i++)
{
System.out.println((x==y)+" : "+x+++" : "+y++);
}
然后,它显示true
,直到x
和y
的值都为127
。在所有其他情况下(即当x
和y
的值增加127
时 - 当这些变量的值大于127
时)。
那么为什么会这样呢?这种行为有什么规范吗?
答案 0 :(得分:2)
JVM中值-128到+127的整数是cached。
此外,这是关于它的Java Language Specification页面。具体而言,第5.1.7节陈述
如果框中的值p为true,false,则为字节或字符 范围\ u0000到\ u007f,或介于-128和127之间的int或短数字 (包括),然后让r1和r2成为任意两个拳击的结果 转换p。始终是r1 == r2。
的情况
答案 1 :(得分:1)
这是原始类型装箱的情况,它是正确的。 Java Integers
使用flyweight模式缓存,最大值为128。