java - 当我将原始类型 int 放入 java 中的 ArrayList 时,为什么原始类型 int 会自动更改为对象 Integer?
6 回答
Autoboxing
自动将primitive
类型转换为相应的wrapper
对象。其背后的原因是您不能将原语放入集合中。在Java 5出现之前,您必须自己执行此操作,但现在它会自动为您处理。
有关更多详细信息,请参见此处的链接:http: //docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
它auto-boxing
在java中被调用。
正如任何 Java 程序员都知道的那样,您不能将 int(或其他原始值)放入集合中。集合只能保存对象引用,因此您必须将原始值装入适当的包装类(在 int 的情况下为 Integer)。当你从集合中取出对象时,你会得到你放入的 Integer;如果需要 int,则必须使用 intValue 方法对 Integer 进行拆箱。所有这些装箱和拆箱都是一种痛苦,并且会使您的代码混乱。自动装箱和拆箱功能使过程自动化,消除了痛苦和混乱。
ArrayList 只能存储对象。int 是一种原始数据类型,因此它被“自动装箱”为等效的对象。这只发生在 Java 5 之前,在此之前您必须自己装箱 Integer。
自动装箱是因为集合只能容纳对象而不是基元。如果您需要一个 int 原语,则必须在读出时使用 intValue() 方法将其拆箱。
请阅读有关引用类型和值类型的更多信息以更好地理解这一点。
ArrayList 仅保存对对象的引用。它本身不保存值。
由于 int 是一种值类型,因此它没有引用。当您将 int 转换为 Integer 时,您会在内存中为 Integer 创建一些空间,该 Integer 包含一个 int 值,以及对您创建的该 Integer 对象的引用。
现在,您的 ArrayList 只需保存您拥有的 Integer 对象的地址,而不是保留整数本身。
可以这样想:ArrayList 中的一个元素占用内存块:200。您的 Integer 对象位于内存块:400。在内存块 200 中,您保留的不是整数的值,而是 400 的内存地址。
原因,我不知道。我猜他们只是决定这样做是为了保持简单。
这是 java 1.5 中引入的一个 java 语言特性。它被称为自动装箱。
粗略地说,它在 java 原始类型与其对应的包装类类型之间进行转换。编译器检测何时需要(并且可能)收件箱(原始到包装器)或出箱(包装器到原始件),并将表达式扩展为正确的字节码。
因此,在幕后,Integer
当您添加int
.