为什么Integer和int可以互换使用?

我很困惑为什么Integer和int可以在Java中互换使用,即使一个是原始类型而另一个是对象?

例如:

Integer b = 42; int a = b; 

要么

 int d = 12; Integer c = d; 

发表文章的前几句话很好地描述了它:

您不能将int(或其他原始值)放入集合中。 集合只能保存对象引用,因此必须将原始值装入适当的包装类(在int的情况下为Integer)。 当您从集合中取出对象时,您将获得放入的Integer; 如果需要int,则必须使用intValue方法取消对Integer的装箱。 所有这些装箱和拆箱都是一种痛苦,并使你的代码变得混乱。 自动装箱和拆箱function可自动完成整个过程,消除痛苦和杂乱。

简而言之,基本上就是这样。 它允许您利用收集框架来获得灵感,而无需自己完成工作。

主要缺点是它会使新程序员感到困惑,并且如果不能正确理解和使用代码,可能会导致代码混乱/混乱。

Java支持自动装箱并自动将原始值包装到对象中,并将对象解包为某些类型的原始值,如charCharacterintIntegerdoubleDouble等。

Oracle文档中的注释:

那么什么时候应该使用自动装箱和拆箱? 仅在引用类型和基元之间存在“阻抗不匹配”时才使用它们,例如,当您必须将数值放入集合时。 将自动装箱和拆箱用于科学计算或其他对性能敏感的数字代码是不合适的。 Integer不能替代int; autoboxing和unboxing模糊了原始类型和引用类型之间的区别,但它们并没有消除它。

由于自动装箱和自动装箱http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

它叫做AutoBoxing 。 这将解释它究竟是什么。

“可互换地”使用intInteger称为autoboxing 。 此function是在Java 5中引入的。在此之前,您的示例代码不会编译。 相反,你必须写这样的东西:

 Integer b = Integer.valueOf(42); // or new Integer(42); int a = b.intValue(); 

要么

 int d = 12; Integer c = Integer.valueOf(d); // or new Integer(d); 

这是相当冗长的,这就是引入自动装箱的原因。 编译器的魔力使编码器的生活更轻松。

从技术上讲, intInteger本身不可互换,不能在需要另一个的地方使用。 但是,自动装箱允许两者之间的隐式转换。

作为旁注,有一种情况是自动装箱(特别是拆箱)失败。 如果您的代码尝试自动装入空值,您将在运行时获得NullPointerException ,例如:

 Integer b = null; int a = b; // NullPointerException here! 

只是需要注意的事情……

除了其他答案之外,因为Integer是一个包装类,它允许您对int值进行装箱和取消装箱。 其他信息在这里 。

java语言规范声明java虚拟机必须为整数和其他一些类型执行自动装箱/拆箱 。