Integer a = 5;
int b = 5;
System.out.println(a==b); // Print true
但为什么打印成真,因为a是Integer
的实例而b是原始int
?
答案 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
。
应该强调的是,如果a
为null
,则此转换将失败;也就是说,在尝试进行等效性检查时,您将获得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));
}
}