当前位置: 首页 > 面试题库 >

是否可以保证Java中新的Integer(i)== i?

冯阳华
2023-03-14
问题内容

考虑以下代码段:

    int i = 99999999;
    byte b = 99;
    short s = 9999;
    Integer ii = Integer.valueOf(9); // should be within cache

    System.out.println(new Integer(i) == i); // "true"
    System.out.println(new Integer(b) == b); // "true"
    System.out.println(new Integer(s) == s); // "true"
    System.out.println(new Integer(ii) == ii); // "false"

很明显为什么最后一行 总是会 打印"false":我们正在使用==引用标识比较,并且一个new对象 永远不会
==已经存在的对象

问题是关于前三行:这些比较是否 保证
在原始的情况下int以及Integer自动拆箱?在某些情况下,原语将被自动装箱,并执行参考身份比较吗?(然后全部变为false!)


问题答案:

是。
JLS第5.6.2节指定了二进制数值提升的规则。部分:

当运算符将二进制数值提升应用于一对操作数时,每个操作数必须表示一个可转换为数字类型的值,以下规则适用,以便根据需要使用加宽转换(第5.1.2节)来转换操作数:

如果任何一个操作数是引用类型,则执行装箱转换(第5.1.8节)。

二进制数值提升适用于几种数值运算符,包括“数值相等运算符==和!=”。

JLS§15.21.1(数字等于运算符==和!=)指定:

如果相等运算符的操作数都是数字类型,或者一个是数字类型,而另一个是可转换(第5.1.8节)为数字类型,则对操作数(第5.6.2节)执行二进制数字提升。

相反,JLS§15.21.3(参考相等运算符==和!=)提供:

如果相等运算符的操作数均为引用类型或null类型,则该操作为对象相等

这符合装箱和拆箱的常识,只有在不匹配的情况下才这样做。



 类似资料:
  • 问题内容: 我真的是在这里指身份平等。 例如,以下内容将始终打印 true 吗? 问题答案: 是的,类令牌是唯一的(对于任何给定的类加载器而言)。 即,您将始终 在相同的类加载器领域中 获得对相同物理对象的引用。但是,不同的类加载器将加载不同的类令牌,同时,当两个不同的类加载器加载相同的类定义时,会将相同的类定义视为不同。

  • 问题内容: 我是Java新手,我想知道我是否具有以下典型的Java代码 JVM是否保证将始终运行finally块?为了了解我的来历,我已经习惯了C / C ++程序,如果您取消引用NULL指针,并且之后没有任何代码可以运行,它们可能会崩溃。 但是,据我了解Java和整个GC /托管内存业务的一般情况,没有诸如空指针取消引用之类的东西,所有这些都是可捕获的期望,因此,我的程序实际上没有崩溃的方法可能

  • MainActivity.class MainActivity中的

  • 问题内容: 我特别想知道PostgreSQL。给出以下人为的示例: 从外部查询返回的名称是否保证与内部查询的顺序相同? 问题答案: 不,在外部查询中按以下顺序排序: 内部(子)查询返回结果集。如果按此顺序进行排序,则保证从内部(子)查询传递到外部查询的中间结果集将按照您指定的方式进行排序,但是在外部查询中不对结果进行排序通过处理内部查询结果集生成的结果集,不能保证以任何方式进行排序。

  • 我想做到这一点: 我该怎么做?我想在那里得到变量名,但它将是不起作用的东西(字符串整数)的组合,而不是变量名

  • Hy,我有一个webapplication,我试图在其中集成JPA2(Hibernate)+Spring+Flyway 我将flyway添加到我的ApplicationContext中,如下所示: 有什么想法吗?