我读到,“因此,当使用Integer.valueOf创建对象或直接为整数赋值时,将返回相同的对象。”
这就是为什么:-
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");
}有人能解释一下吗?
发布于 2019-10-17 14:49:06
你误解了“相同的物体将被归还”的意思。
因此,与==的比较实际上是比较内存位置,并且只有当两个变量持有相同的对象(即存储在同一个内存位置)时才返回true。
在-128到127之间的值存储在整数常量池中,这意味着每10是相同的10 (即相同的内存位置),每12是相同的12等等。但情况不是所有的10s也是12s,这就是你无意中假设的问题。
无论如何,一旦超出了该范围,每个基本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",因为a和b是存储在不同内存位置的两个不同的对象。
这就是为什么你应该和.equals()做比较
发布于 2019-10-17 14:42:16
==检查两个引用是否指向相同的内存位置.。
在第一种情况下,两个值都是相同的,因此它们指向相同的位置,只创建一个对象。
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");
}发布于 2019-10-17 14:48:25
如果您阅读了实际的爪哇文档,您将看到它实际上正在做什么的更清楚的描述
返回表示指定int值的Integer实例。如果不需要新的Integer实例,则通常应该优先使用此方法而不是构造函数Integer(int),因为这种方法可能会通过缓存频繁请求的值来获得更好的空间和时间性能。此方法将始终将值缓存在范围-128至127 (包括在内),并可能缓存此范围之外的其他值。
由于返回的Integer必须表示指定的int值,因此不可能
Integer a = 10;
Integer b = 12;
System.out.println((a==b));将打印"true",因为相同的对象显然不能同时表示两个值。
编辑:
为了精确起见,Java标准不要求Integer自动装箱(将原始int分配给Integer对象)使用Integer.valueOf(),所以在符合规范的Java实现中很有可能
Integer a = 10;
Integer b = 10;
System.out.println((a==b));会打印“假”;
https://stackoverflow.com/questions/58435030
复制相似问题