Java 中的快速 autoboxing/auto-unboxing 问题

Quick autoboxing/auto-unboxing question in Java

我刚刚在 Java 中了解到自动装箱的概念,我有几个简单的问题可以帮助我澄清我的理解。据我了解,当我们声明一个数组列表时,例如

ArrayList<Integer> myList = new ArrayList<Integer>();

我们仍然可以将原始整数放入 myList 中,因为原始整数会自动包装到 Integer 对象中。我猜这意味着如果我尝试向此 ArrayList 添加一个 Integer 对象,那么不会有任何自动装箱,因为我正在添加 'correct' 类型?换句话说,我猜命令

myList.add(new Integer(2));

不使用任何自动装箱。同样,我猜从这个 ArrayList 中检索元素并将它们存储在它们的包装器中不需要自动装箱,因为我没有将它们放在它们的基元中?又名:

Integer a = myList.get(0);

不开箱?据我了解,当我尝试将图元混合到图片中时会发生拆箱:

int b = 4;
Integer c = a + b;

在这种情况下,我认为 a 会自动拆箱为 int 基元,与 int b 相加,然后自动将其自身装箱为整数对象?我的理解是否正确?

你的理解是正确的。

当 2004 年 Java 5 中引入自动装箱时,人们开始混淆 Integerint。在此之前,您必须明确地装箱和拆箱。自动装箱的优点是代码更简洁,但也有一些缺点,即一些新手程序员没有意识到到底发生了什么,并且无意中编写了不必要的装箱和拆箱代码。

顺便说一下,您的 new Integer(2) 示例最好编码为 Integer.valueOf(2)。后者将使用缓存对象而不是创建新对象。