【问题标题】:Do I get an Integer or int after putting an int into an object array?将 int 放入对象数组后,我会得到 Integer 还是 int?
【发布时间】:2011-02-21 00:41:59
【问题描述】:

(1) int a; new Object[] {a} 是否与 (2) new Object[] {new Integer(a)} 相同? 如果我做第一个,(new Object[]{a})[0] 会给我一个Integer 吗? 谢谢

【问题讨论】:

  • 你可以测试你的第二个问题。
  • @Vishal:这就是 Java 中数组字面量的定义方式。
  • @Syntactic:谢谢,我想我用数组已经很久了! ;)

标签: java arrays object integer


【解决方案1】:

是的,是的。

您实际上不能将int 放入Object[]。您正在做的是利用 Java 的一个名为 autoboxing 的功能,其中像 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) 更快并且使用更少的内存.

【讨论】:

  • 不完全是;自动装箱不使用new Integer(...),但Integer.valueOf(...) 略有不同。注意Integer.valueOf(...) 并不总是返回一个新的Integer 对象;它对 -128 到 127 之间的值有一个缓存。
【解决方案2】:

在底层发生的事情是 Java 编译器添加了 Integer.valueOf(a) 之类的代码,以便将您的 int 值转换为 Object。

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多