问题描述
- JAVA 自动装箱Integer i1=100 的问题
-
Integer i1=100;
Integer i2=100;这个时候的i1和i2是不是同一个对象?指向同一块内存?
为什么我修改i1的值 i1=101;
这个时候的i2的值会发生改变吗
解决方案
当然不会,因为是值类型。
你永远不要指望能用两个变量共享一个值类型
除非你将它定义成引用类型的一个成员变量,然后去使用这个引用类型。
解决方案二:
多说几句,
Integer i1=100;
Integer i2=100;
因为是值类型,这两个变量保存在不同的内存,各自有100这个值。
i2 = i1;
因为是值类型,所以会把i1的值复制给i2,之后它们还是倆
Object o1 = i1;
此时i1被装箱了
Object o2 = o1;
没错它们是指向一个引用
o1 = 123;
123被装箱,o1指向新的对象,和o2分离
i2 = o2;
o2被拆箱,i2得到的是o2拆箱的值,复制给i2
你可以看出无论怎么绕,都不能对一个值类型共享两个变量
解决方案三:
小白真多。一个个说的和真的似的。
解决方案四:
你这种是需要编译器实现的时候做的优化。取决于实现。
比如python这种情况就会都指向同一个引用。
解决方案五:
这是基本数据类型,是值类型,各是各的,互不影响
解决方案六:
我记得在一个小范围内,都指的一个
好像
解决方案七:
这时候i1,i2应该是指向的同一块内存,但是你修改i1之后,i1和i2就不是指向的同一块内存了,你直接用==判断不就可以了吗
解决方案八:
Integer i1=100;
Integer i2=100;
这样装箱是指向同一个Integer的,如果自己想看看源码,可以看一下valueof里面的源码。java在初始化时IntegerCache初始化了-128-127的所有整数对象,所有装箱时如果数值在这个范围内,相同的数值是同一个对象。
整型对象是不可修改的。赋值新值就是新装箱,也就是新对象。
比如
Integer i1=100;
Integer i2= new Integer(100);就是两个不同的对象,new是不走装箱的,是在堆中建立新对象。
解决方案九:
Integer i1=100;Integer i2=100;这时i1==i2的,是指向同一个内存的。对包装类的自动装箱、自动拆箱也是一种语法糖, Java的new Integer操作,当参数值在【-128,127】之间时,new操作返回的对象是有缓存的,所以i1和i2引用的内存一样的。当你把i1=101后,i1指向新的地址,而i2仍然指向原来的地址,所以不会影响。
可以参考该文章:http://blog.csdn.net/wojiushiwo945you/article/details/39212679