gpt4 book ai didi

java - 关于Java内存管理

转载 作者:行者123 更新时间:2023-12-01 07:12:19 24 4
gpt4 key购买 nike

Possible Duplicate:
Integer wrapper objects share the same instances only within the value 127?

我有一个关于 Java 内存管理的问题。

当我尝试以下代码时:

Integer a = 1;
Integer b = 1;
System.out.println(a==b); // this gives "true"

但是,

Integer a = 256;
Integer b = 256;
System.out.println(a==b); //this gives "false"
为什么?

非常感谢。

最佳答案

这是因为“自动装箱”使用 Integer.valueOf,并且 Integer.valueOf 保留小整数值的 Integer 对象的缓存。 JLS 的说法如下:

"If the value p being boxed is true, false, a byte, or a char in the range \u0000 to \u007f, or an int or short number between -128 and 127 (inclusive), then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2." JLS 5.1.7.

当您使用==运算符比较一对Integer对象时,它实际上是在比较对象引用。因此,如果装箱为您提供了相同的缓存 Integer 对象,则您将获得 true ,如果没有,则为 false 。请注意,JLS 在规定的范围内保证这种行为,但它也允许实现 valueOf 方法来缓存更广泛的值.

最重要的是,您应该使用 equals(Object) 来比较 Integer 对象...除非您真的尝试测试如果它们是同一个对象。

<小时/>

According to what I read, "Integer" should create an "object" in the heap, thus the two objects should be the same.

如果您的代码显式执行new Integer(...),则保证创建一个新的Integer 对象。但是,自动装箱使用 Integer.valueOf(...),这就是实现缓存行为的地方。

关于java - 关于Java内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11921000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com