任何人都可以告诉我产出变化的原因。
public class Demo {
public void demo()
{
Integer y = 567;
Integer x = y;
System.out.println(x + " " + y);
System.out.println(y == x);
y++;
System.out.println(x + " " + y);
System.out.println(y == x);
y--;
System.out.println(x + " " + y);
System.out.println(y == x);
}
public static void main(String args[])
{
Demo obj = new Demo();
obj.demo();
}
}
输出:
567 567
true
567 568
false
567 567
False
这就是为什么我得到最后的错误。
答案 0 :(得分:5)
您正在使用Integer
这是一个不可变对象。
基本上你的代码是
y = new Integer(y.intValue() + 1);
和
y = new Integer(y.intValue() - 1);
因此,您创建的两个新Integer
个对象与前一个对象不同(==
)。
此行为在Java中称为 autoboxing 。
答案 1 :(得分:3)
更改您的
Integer y = 567;
Integer x = y;
到
int y = 567;
int x = y;
并且令人惊讶的行为将会消失。我的猜测是你偶然发现Java隐含的 autoboxing 原始值到包装器对象中,并且导致你相信你正在直接操纵这些数字。
答案 2 :(得分:2)
这是因为编译器在内部执行此操作:
y--
表示:
int _y = y.intValue();
_y--;
y = Integer.valueOf(_y);
因此,y
有一个新的Integer
实例。您正在进行对象引用检查(使用==
时)而不是值相等检查。
使用equals()
方法评估2个值。
答案 3 :(得分:1)
Integer y = 567; // y=567
Integer x = y; // x is equal to y object
System.out.println(x + " " + y); // out put x and y so obviously x and y are 567
System.out.println(y == x); // here x and y are in same reference. so this x==y is true and out put is true.
y++; // increment y by 1. then y=568
System.out.println(x + " " + y); // now x= 567 and y= 568
System.out.println(y == x);// now x not equals to y then false will print
y--; // again decrement y value
System.out.println(x + " " + y); // again x and y are same 567
System.out.println(y == x);// here y.value == x.value but x and y object wise not equal since object x and y are referring deference points
答案 4 :(得分:0)
因为x和y指的是2个不同的对象。
y--;
首先将y解包为int而不是减去它,然后将其打包为Integer。这个新的盒装整数指的是不同的内存位置。
理想情况下,在包装类上,最好在包装器对象而不是==运算符上调用equals方法。
答案 5 :(得分:0)
y == x
检查内容相等性,即它们是否指向同一个对象,而不是它们指向的对象是否包含相同的int
。特别是在x, y >= 128
。
使用
y.equals(x);
或
(int) y == (int) x
或将x
和y
声明为int
。
请注意,Integer == Integer
或Integer != Integer
不会发生自动取消装箱。
答案 6 :(得分:0)
使用原始int
而不是Integer
时。最终输出为true
。
但是,当您使用Integer
课程时,这些课程为Object
。如果您使用equals
方法,则最终输出为true
。
答案 7 :(得分:-1)
甚至,如果你创建
Integer a = new Integer(1000);
Integer b = new Integer(1000);
a == b - false
但是
Integer a = new Integer(1);
Integer b = new Integer(1);
a == b - 是真的
在java中有一个小整数的缓存:-127到128.所有其他整数都是新创建的对象,它们不能等于。