首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整数对象缓存

整数对象缓存
EN

Stack Overflow用户
提问于 2019-10-17 14:30:43
回答 4查看 72关注 0票数 1

我读到,“因此,当使用Integer.valueOf创建对象或直接为整数赋值时,将返回相同的对象。”

这就是为什么:-

代码语言:javascript
复制
Integer a=100;
Integer b=100;
if(a==b) // return true as both the objects are equal

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

但我在这里得到的输出是“不”

代码语言:javascript
复制
public static void main(String[] args) {

    Integer a = 10;
    Integer b = 12;
    if(a == b)
        System.out.println("same");
    else
        System.out.println("Not");
}

有人能解释一下吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-17 14:49:06

你误解了“相同的物体将被归还”的意思。

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

在-128到127之间的值存储在整数常量池中,这意味着每10是相同的10 (即相同的内存位置),每12是相同的12等等。但情况不是所有的10s也是12s,这就是你无意中假设的问题。

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

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

代码语言:javascript
复制
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()做比较

票数 2
EN

Stack Overflow用户

发布于 2019-10-17 14:42:16

==检查两个引用是否指向相同的内存位置.

在第一种情况下,两个值都是相同的,因此它们指向相同的位置,只创建一个对象

代码语言:javascript
复制
Integer a=100;
Integer b=100;
if(a==b) // return true as both the objects are equal

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

代码语言:javascript
复制
public static void main(String[] args) {

    Integer a = 10;
    Integer b = 12;
    if(a == b)
        System.out.println("same");
    else
        System.out.println("Not");
}
票数 1
EN

Stack Overflow用户

发布于 2019-10-17 14:48:25

如果您阅读了实际的爪哇文档,您将看到它实际上正在做什么的更清楚的描述

返回表示指定int值的Integer实例。如果不需要新的Integer实例,则通常应该优先使用此方法而不是构造函数Integer(int),因为这种方法可能会通过缓存频繁请求的值来获得更好的空间和时间性能。此方法将始终将值缓存在范围-128至127 (包括在内),并可能缓存此范围之外的其他值。

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

代码语言:javascript
复制
Integer a = 10;
Integer b = 12;
System.out.println((a==b));

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

编辑:

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

代码语言:javascript
复制
Integer a = 10;
Integer b = 10;
System.out.println((a==b));

会打印“假”;

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58435030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档