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