首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个Integer包装类

比较两个Integer包装类
EN

Stack Overflow用户
提问于 2016-08-24 07:18:36
回答 4查看 2K关注 0票数 0

为什么这个程序在第一次打印语句中是假的,在打印语句中是正确的。I和i1是两个不同的对象,所以第一个语句必须打印"true",这是预期的,但是第二个print语句打印"false“,这会造成混乱。

代码语言:javascript
复制
public static void main(String[] args) {
        Integer i = new Integer(10);
        Integer i1 = new Integer(10);
        System.out.println(i == i1); //printing false
        i++;
        i1++;
        System.out.println(i == i1);//printing true
    } 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-24 07:20:48

使用new关键字总是创建两个不同的实例。因此,以下内容始终是正确的:

代码语言:javascript
复制
new Integer(10) != new Integer(10)

因此,第一行打印"false“。

然后:

代码语言:javascript
复制
i++;

隐藏了拳击和拳击。它相当于:

代码语言:javascript
复制
i = Integer.valueOf(i.intValue() + 1);

正如在Integer.valueOf中所描述的,从-128到127的值(至少)是缓存的:您正在为i++i1++取回缓存的Integer.valueOf(11)实例,因此第二行打印"true“。

票数 5
EN

Stack Overflow用户

发布于 2016-08-24 07:27:08

在此:

代码语言:javascript
复制
Integer i = new Integer(10);
Integer i1 = new Integer(10);

您请求动态分配两个Integer类类型的实例,这将为您提供两个不同的引用。如果将其更改为:

代码语言:javascript
复制
Integer i = 10;
Integer i1 = 10;

然后I和i1的引用将相等,因为对于小值,包装器类使用缓存的对象。

这是:

代码语言:javascript
复制
    i++;
    i1++;

在JLS中的:15.14.2.后缀增量算子++中解释:

在添加之前,对值1和变量的值执行二进制数值提升(§5.6.2)。如果有必要,可以通过缩小原语转换(§5.1.3) *和/或在存储变量之前将其转换为变量类型(§5.1.7)来缩小和。

另外,下面的一个注意事项很重要,说明在应用运算符之前,可能会发生取消装箱转换:

请注意,上面提到的二进制数值提升可能包括取消装箱转换(§5.1.8)和值集转换(§5.1.13)。如果有必要,将值集转换应用到和被存储在变量中之前。因此,这意味着它被装箱回包装器类型。

因此,在将运算符++应用于已分配的Integer实例的引用类型或for类之后,如果其值在装箱类型的正确范围内,则以盒式整数结束。

票数 1
EN

Stack Overflow用户

发布于 2016-08-24 07:33:26

第一种是引用比较,因此得到假,第二种是值比较(在递增时,它不被装箱到原始int,因此增加到11,并再次自动装箱;i1也是如此)。第二个调用是(11 == 11),因此是真调用。

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

https://stackoverflow.com/questions/39116784

复制
相关文章

相似问题

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