指向同一 Integer 对象的变量之间的比较
当前程序的输出是“Strange”。但这两个变量共享相同的引用。为什么第二个和第三个比较不正确?
Integer a;
Integer b;
a = new Integer(2);
b = a;
if(b == a) {
System.out.println("Strange");
}
a++;
if(b == a) {
System.out.println("Stranger");
}
a--;
if(b == a) {
System.out.println("Strangest");
}
输出:奇怪
The output of current program is "Strange". But both the variables share the same reference. Why are the second and third comparisons not true?
Integer a;
Integer b;
a = new Integer(2);
b = a;
if(b == a) {
System.out.println("Strange");
}
a++;
if(b == a) {
System.out.println("Stranger");
}
a--;
if(b == a) {
System.out.println("Strangest");
}
Output: Strange
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是自动装箱的产物,也是 Java 中 Integer 不可变的事实。
a++
和a--
大致翻译为这样。That's the artifact of autoboxing and a fact that Integer is immutable in Java.
The
a++
anda--
are translated to roughly this.Strage
- 很明显,两个变量指向同一个对象由于自动装箱,所以不是
Stranger
。Integer
是不可变的,因此对其进行的每个操作都会创建一个新实例。不是
奇怪
,因为前面的一点,并且因为您使用了new Integer(..)
,它忽略了用于字节范围的缓存。如果您最初使用Integer.valueOf(2)
,那么将使用缓存的Integer
并且也会打印Strangest
。Strage
- it's obvious, the two variables point to the same objectnot
Stranger
because of autoboxing.Integer
is immutable, so each operation on it creates a new instance.not
Strangest
, because of the previous point, and because you have usednew Integer(..)
which ignores the cache that is used for the byte range. If you useInteger.valueOf(2)
initially, then the cachedInteger
s will be used andStrangest
will also be printed.Integer 对象是不可变的,现有对象的任何更改都会创建一个新对象。因此,在
a++
之后,将创建一个新对象,并且a
将开始指向该新对象,而b
仍指向旧对象。因此,在a++
之后,a
和b
指向不同的对象,并且a == b
将始终返回 false 。关于提到的例子:
An Integer object is immutable, any change in an existing object will create a new object. So after
a++
, a new object will be created anda
will start pointing to that new object whileb
is still pointing to the old object. Hence, aftera++
,a
andb
are pointing to different objects anda == b
will always return false.with respect to the mentioned example :