7

以下代码完美运行并将 1 和 2 值添加到列表中,但为什么呢?为什么不需要显式创建 Short 对象?例如:list.add(new Short(1));

List<Short> list = new ArrayList();
list.add((short)1);
list.add((short)2);
System.out.println(list);
4

2 回答 2

14

这称为自动装箱。它是一种自动将基元转换为其相应对象类型的功能。它从 Java 1.5 开始存在。

自动装箱的反面称为自动拆箱,但要注意 NullPointerException

于 2012-05-08T19:16:13.263 回答
1

这称为自动装箱。

请注意,它仍然会Short自动创建真正的对象,这些对象在您的堆上占用 16 个字节,与 Integer 对象相同。只有原生short值只占用 2 个字节(但不能放入java.util.collections)。

在很多情况下

list.put((short) 12345);
list.put((short) 12345);

实际上甚至会创建两个这样的对象,即 32 字节加上列表对象占用的内存。存储在列表中的指针每个已经占用了 4-8 个字节。

如果您只有几个实例,那没关系。如果你有几百万,这可能会因为内存管理和使用而严重影响性能。使用原始短裤,您通常可以走 10 倍的距离,然后才会变慢或内存不足。

于 2012-05-08T19:21:54.313 回答