pen*_*926 0 java memory autoboxing
可能重复:
整数包装器对象仅在值127内共享相同的实例?
我对Java中的内存管理有疑问.
当我尝试以下代码时:
Integer a = 1;
Integer b = 1;
System.out.println(a==b); // this gives "true"
Run Code Online (Sandbox Code Playgroud)
然而,
Integer a = 256;
Integer b = 256;
System.out.println(a==b); //this gives "false"
Run Code Online (Sandbox Code Playgroud)
为什么?
非常感谢.
这是因为"autoboxing"使用Integer.valueOf
并Integer.valueOf
保留Integer
对象的缓存以获得小整数值.以下是JLS所说的内容:
"如果装箱的值p为真,假,一个字节,或者在\ u0000到\ u007f范围内的字符,或者在-128到127(含)之间的整数或短数,那么让r1和r2为结果p的任何两个拳击转换.总是r1 == r2的情况." JLS 5.1.7.
当您使用==
运算符比较一对Integer
对象时,它实际上是在比较对象引用.所以你的get true
如果拳击给你相同的缓存Integer
对象,false
如果没有.请注意,JLS 保证了所述范围的这种行为,但它也允许实现该valueOf
方法来缓存更广泛的值.
最重要的是你应该equals(Object)
用来比较Integer
对象......除非你真的试图测试它们是否是同一个对象.
根据我读到的内容,"Integer"应该在堆中创建一个"对象",因此两个对象应该是相同的.
如果您的代码明确地执行了new Integer(...)
,则保证创建新Integer
对象.但是,autoboxing使用Integer.valueOf(...)
,这就是实现缓存行为的地方.
归档时间: |
|
查看次数: |
133 次 |
最近记录: |