1

java - 当我将原始类型 int 放入 java 中的 ArrayList 时,为什么原始类型 int 会自动更改为对象 Integer?

4

6 回答 6

12

Autoboxing自动将primitive类型转换为相应的wrapper对象。其背后的原因是您不能将原语放入集合中。在Java 5出现之前,您必须自己执行此操作,但现在它会自动为您处理。

有关更多详细信息,请参见此处的链接:http: //docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

于 2012-12-04T11:26:56.033 回答
2

auto-boxing在java中被调用。

正如任何 Java 程序员都知道的那样,您不能将 int(或其他原始值)放入集合中。集合只能保存对象引用,因此您必须将原始值装入适当的包装类(在 int 的情况下为 Integer)。当你从集合中取出对象时,你会得到你放入的 Integer;如果需要 int,则必须使用 intValue 方法对 Integer 进行拆箱。所有这些装箱和拆箱都是一种痛苦,并且会使您的代码混乱。自动装箱和拆箱功能使过程自动化,消除了痛苦和混乱。

关联

于 2012-12-04T11:27:50.847 回答
1

ArrayList 只能存储对象。int 是一种原始数据类型,因此它被“自动装箱”为等效的对象。这只发生在 Java 5 之前,在此之前您必须自己装箱 Integer。

于 2012-12-04T11:28:04.993 回答
1

自动装箱是因为集合只能容纳对象而不是基元。如果您需要一个 int 原语,则必须在读出时使用 intValue() 方法将其拆箱。

于 2012-12-04T11:28:23.763 回答
0

请阅读有关引用类型和值类型的更多信息以更好地理解这一点。

ArrayList 仅保存对对象的引用。它本身不保存值。

由于 int 是一种值类型,因此它没有引用。当您将 int 转换为 Integer 时,您会在内存中为 Integer 创建一些空间,该 Integer 包含一个 int 值,以及对您创建的该 Integer 对象的引用。

现在,您的 ArrayList 只需保存您拥有的 Integer 对象的地址,而不是保留整数本身。

可以这样想:ArrayList 中的一个元素占用内存块:200。您的 Integer 对象位于内存块:400。在内存块 200 中,您保留的不是整数的值,而是 400 的内存地址。

原因,我不知道。我猜他们只是决定这样做是为了保持简单。

于 2012-12-04T11:35:25.703 回答
0

这是 java 1.5 中引入的一个 java 语言特性。它被称为自动装箱

粗略地说,它在 java 原始类型与其对应的包装类类型之间进行转换。编译器检测何时需要(并且可能)收件箱(原始到包装器)或出箱(包装器到原始件),并将表达式扩展为正确的字节码。

因此,在幕后,Integer当您添加int.

于 2012-12-04T11:32:17.430 回答