![](/img/trans.png)
[英]Do multiple reference variables pointing to the same object each take up the same memory footprint as the object
[英]Comparison between variables pointing to same Integer object
当前程序的输出是“奇怪的”。 但两个变量共享相同的参考。 为什么第二次和第三次比较不正确?
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");
}
输出: Strange
这是autoboxing的工件,以及Integer在Java中不可变的事实。
a++
和a--
大致翻译a--
这个。
int intA = a.getInt( );
intA++;
a = Integer.valueOf( intA ); // this is a reference different from b
Strage
- 很明显,这两个变量指向同一个对象
因为自动装箱而不是Stranger
。 Integer
是不可变的,因此每个操作都会创建一个新实例。
因为前一点,并且因为你使用了new Integer(..)
而忽略了用于字节范围的缓存,所以并不是Strangest
。 如果最初使用Integer.valueOf(2)
,则将使用缓存的Integer
并且还将打印Strangest
。
Integer对象是不可变的,现有对象中的任何更改都将创建一个新对象。 因此, a++
,将创建a
新对象,并且当b
仍然指向旧对象时,将开始指向该新对象。 因此,在a++
, a
和b
指向不同的对象,而a == b
将始终返回false。
关于上述例子:
Integer a; //created Integer reference
Integer b; //created Integer reference
a = new Integer(2);//created new Integer Object and a reference is assigned to that new object
b = a;//b also start pointing to same Integer object
if(b == a) { // b==a will be true as both are pointing to same object
System.out.println("Strange");
}
a++; //after a++ , a new Integer object will be created (due to Integer immutablity and a will point to that new object while b is still pointing to old), so b==a will be false
if(b == a) {
System.out.println("Stranger");
}
a--; //again a new Integer Object will be created and now a will start pointing to that new Object , so b==a will be false
if(b == a) {
System.out.println("Strangest");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.