关于Java内存管理

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)

为什么?

非常感谢.

Ste*_*n C 6

这是因为"autoboxing"使用Integer.valueOfInteger.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(...),这就是实现缓存行为的地方.