Java中的整数实例和int原始值比较

时间:2016-01-01 07:38:25

标签: java

Integer a = 5;
int b = 5;

System.out.println(a==b); // Print true

但为什么打印成真,因为a是Integer的实例而b是原始int

4 个答案:

答案 0 :(得分:11)

当您比较基元和包装类时,Java使用Unboxing的概念。 Integer变量中的位置被转换为原始int类型。

以下是您的代码所发生的事情:

Integer a = 5; //a of type Integer i.e. wrapper class
int b = 5; //b of primitive int type

System.out.println(a==b) // a is unboxed to int type and compared with b, hence true

有关Autoboxing(取消装箱的反向)和Unboxing this链接的更多信息。

答案 1 :(得分:3)

从JDK 5开始,Java增加了两个重要功能:自动装箱和自动拆箱。

  

自动装箱是原始类型自动生成的过程   每当一个封装(盒装)到它的等效类型包装器   需要那种类型的对象。没有必要明确   构建一个对象。

     

自动取消装箱是装箱对象的值的过程   自动从类型包装器中提取(取消装箱)其值   需要。

使用自动装箱,不再需要手动构造对象 包装原始类型:

Integer someInt = 100; // autobox the int (i.e. 100) into an Integer

要取消装箱对象,只需将该对象引用分配给基本类型变量:

int unboxed = someInt // auto-unbox Integer instance to an int

答案 2 :(得分:2)

正确答案是由于取消装箱,但让我们在这里更明确。

in the Java Language Specification描述了数值等价的规则,特别是这些规则:

  

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

由于Integer可转换为数字类型(每these rules),因此您所比较的值在语义上等同于a.intValue() == b

应该强调的是,如果anull,则此转换将失败;也就是说,在尝试进行等效性检查时,您将获得NullPointerException

答案 3 :(得分:1)

这里的所有答案都是正确的。

这是编译时的代码

public class Compare {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Integer a=5;
        int b=5;

        System.out.println(a==b);
        //the compiler converts the code to the following at runtime: 
        //So that you get it at run time
        System.out.println(a==Integer.valueOf(b));


    }

}