我很困惑为什么Integer和int可以在Java中互换使用,即使一个是基本类型而另一个是对象?
例如:
Integer b = 42;
int a = b;
或者
int d = 12;
Integer c = d;
答案 0 :(得分:13)
发表文章的前几句话描述得非常好:
您不能将int(或其他原始值)放入集合中。集合只能保存对象引用,因此必须将原始值装入适当的包装类(在int的情况下为Integer)。当您从集合中取出对象时,您将获得放入的Integer;如果需要int,则必须使用intValue方法取消对Integer的装箱。所有这些装箱和拆箱都是一种痛苦,并使你的代码变得混乱。自动装箱和拆箱功能可自动完成整个过程,消除痛苦和杂乱。
基本上简单来说就是这样。它允许您利用收集框架来获得灵感,而无需自己完成工作。
主要的缺点是它会让新程序员感到困惑,如果不能正确理解和使用它们,可能会导致代码混乱/混乱。
答案 1 :(得分:8)
Java支持autoboxing并自动将原始值包装到对象中,并将对象解包为某些类型的原始值,例如char
- Character
,int
- {{1} },Integer
- double
等等。
来自Oracle Documentation的注释:
那么什么时候应该使用自动装箱和拆箱?仅在引用类型和基元之间存在“阻抗不匹配”时才使用它们,例如,当您必须将数值放入集合时。将自动装箱和拆箱用于科学计算或其他对性能敏感的数字代码是不合适的。 Integer不能替代int; autoboxing和unboxing模糊了原始类型和引用类型之间的区别,但它们并没有消除它。
答案 2 :(得分:4)
答案 3 :(得分:3)
使用int
和Integer
“可互换”称为autoboxing。此功能是在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);
这是相当冗长的,这就是为什么引入了自动装箱的原因。编译器的魔力让编码器的生活更轻松。
从技术上讲,int
和Integer
本身不可互换,不能在需要另一个的地方使用。但是,自动装箱允许两者之间的隐式转换。
作为旁注,有一种情况是自动装箱(特别是拆箱)失败。如果您的代码尝试自动设置空值,您将在运行时获得NullPointerException
,例如:
Integer b = null;
int a = b; // NullPointerException here!
需要注意的事情......
答案 4 :(得分:1)
它被称为AutoBoxing。这将解释它究竟是什么。
答案 5 :(得分:0)
答案 6 :(得分:-1)
java语言规范声明java虚拟机必须执行automatic boxing/unboxing for integers and a few other types。