比较对象和原语,运算符==如何在Java中工作?

时间:2015-01-19 10:16:05

标签: java object comparison primitive

例如:

Long objectLong = 555l;
long primitiveLong = 555l;

System.out.println(objectLong == primitiveLong); // result is true.

是否有调用objectLong.longValue()方法来比较Long或long或者其他某种方式?

1 个答案:

答案 0 :(得分:4)

与以往一样,Java语言规范是咨询的适当资源

来自JLS 15.21.1(“数字平等算子==和!=”):

  

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

     

请注意,二进制数字促销执行值集转换(第5.1.13节)并可执行拆箱转换(第5.1.8节)。

然后从5.6.2(二进制数字促销):

  

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用:

     
      
  • 如果任何操作数属于引用类型,则进行拆箱转换(第5.1.8节)。
  •   
  • [...]
  •   

因此Long已取消装箱到long。您的代码相当于:

Long objectLong = 555l;
long primitiveLong = 555l;

// This unboxing is compiler-generated due to numeric promotion
long tmpLong = objectLong.longValue();

System.out.println(tmpLong == primitiveLong);