(1)int a; new Object[] {a}
是否与(2)new Object[] {new Integer(a)}
相同?
如果我做第一个,(new Object[]{a})[0]
会给我一个Integer
吗?
谢谢
答案 0 :(得分:9)
是的,是的。
您实际上无法将int
放入Object[]
。您正在做的是使用称为 autoboxing 的Java功能,其中像int
这样的原始类型会自动提升到其对应的包装类(在这种情况下为Integer
必要时反之亦然。
您可以阅读有关此here的更多信息。
修改强>
正如Jesper在下面的评论中指出的那样,你的第一个问题的答案实际上不是“是”,而是“它取决于a
的价值”。像在(2)中那样调用构造函数Integer(int)
将始终导致创建一个新的Integer
对象并将其放入数组中。
然而,在(1)中,自动装箱过程不会使用此构造函数;它基本上会调用Integer.valueOf(a)
。这个可以创建一个新的Integer
对象,或者可以返回一个预先存在的缓存Integer
对象,以节省时间和/或内存,具体取决于关于a
的价值。特别是,-128和127之间的值以这种方式缓存。
在大多数情况下,这不会产生显着差异,因为Integer
对象是不可变的。如果要创建大量Integer
个对象(远远超过256个)并且大多数在-128到127之间,那么您的示例(1)可能会更快并且使用的内存更少( 2)。
答案 1 :(得分:0)
Java编译器添加了类似Integer.valueOf(a)的代码,以便将int值转换为Object。