整数对象缓存



我读到"因此,当使用 Integer.valueOf 创建对象或直接将值分配给 -128 到 127 范围内的 Integer 时,将返回相同的对象。

这就是为什么:-

Integer a=100;
Integer b=100;
if(a==b) // return true as both the objects are equal

但是为什么不在下面的情况下呢? 这两个值也在 127 和 -128 的范围内,因此根据上面的语句,这两个值也将返回相同的对象。

但是我在这里得到的输出为"不是">

public static void main(String[] args) {
Integer a = 10;
Integer b = 12;
if(a == b)
System.out.println("same");
else
System.out.println("Not");
}

有人可以解释一下吗?

您误解了"将返回相同的对象"的含义。

因此,与==的比较实际上是比较内存位置,并且仅当两个变量保存相同的对象(即存储在相同的内存位置(时才返回true。

-128 到 127 之间的值存储在整数常量池中,这意味着每 10 是相同的 10(即相同的内存位置(,每 12 是相同的 12,依此类推。 但并不是所有 10 秒也是 12 秒,这就是您的问题无意中假设的。

无论如何,一旦你超出了这个范围,每个基元 int 都是一个新对象,并被分配到常量池之外的新内存位置。

您可以使用以下代码进行测试:

public static void main(String[] args) {
Integer a = 1000;
Integer b = 1000;
if(a == b)
System.out.println("same");
else
System.out.println("Not");
}

这将打印"Not",因为ab是存储在不同内存位置的两个不同对象。

这就是为什么你应该将事物与.equals()进行比较

==检查两个引用是否指向同一内存位置。
在第一种情况下,两个值相同,因此它们指向同一位置,只会创建一个对象

Integer a=100;
Integer b=100;
if(a==b) // return true as both the objects are equal


在第二种情况下,两个值是不同的,因此它们对每个值都有不同的内存位置,因此将创建两个对象

public static void main(String[] args) {
Integer a = 10;
Integer b = 12;
if(a == b)
System.out.println("same");
else
System.out.println("Not");
}

如果你阅读了实际的Java文档,你会看到它实际在做什么的更清晰的描述。

返回一个表示指定 int 值的 Integer 实例。如果不需要新的 Integer 实例,则此方法通常应优先使用构造函数 Integer(int(,因为此方法可能会通过缓存频繁请求的值来产生明显更好的空间和时间性能。此方法将始终缓存 -128 到 127(含(范围内的值,并可能缓存此范围之外的其他值。

由于返回的 Integer 必须表示指定的 int 值,因此不可能

Integer a = 10;
Integer b = 12;
System.out.println((a==b));

将打印"true",因为显然同一个对象不能同时表示两个值。

编辑:

为了精确起见 - Java 标准不要求整数自动装箱(将原始int分配给Integer对象(使用Integer.valueOf(),因此很有可能在符合 Java 的实现中

Integer a = 10;
Integer b = 10;
System.out.println((a==b));

将打印"假";

简单地说,它们不是同一个对象,它们是两个不同的整数实例,用于保存给定的值,因此,如果对象不同,它将始终打印 不是

最新更新