说我有一些代码
public List<Integer> cardIndexes() {
List<Integer> selected = new ArrayList<Integer>();
for (int k = 0; k < cards.length; k++) {
if (cards[k] != null) {
selected.add(new Integer(k));
}
}
return selected;
}
如果卡索引中的那个点不等于null,它将填充一个名为selected的列表。我只是想知道使用selected.add(new Integer(k));
是否有利于使用selected.add(k);
。我假设这里获得的优势是你可以调用方法直接在k上修改k,而不必使用new Integer(k).someMethod;
,但这是否是这里获得的唯一优势?
答案 0 :(得分:6)
从Java 5开始,自动装箱将自动从原始变量创建对象包装类的实例。简而言之,不,没有优势。
答案 1 :(得分:1)
唯一的“优势”(如果你想这么称呼)将是new Integer(a)
使Java的自动装箱明确可见。
在您的情况下这不是问题,但有些情况可能会让人感到困惑,尤其是当您将类与基元混合时(Eclipse有可能将自动装箱转换标记为错误/警告)。
相反,自动装箱将在字节代码中产生Integer.valueOf(a)
,由于内存消耗和性能的原因,通常优先于new Integer(a)
(参见the official javadoc):
public static Integer valueOf(int i)
返回表示指定int值的Integer实例。如果一个 新的Integer实例不是必需的,这个方法一般应该是 优先使用构造函数Integer(int),就像这个方法一样 可能会产生明显更好的空间和时间表现 缓存频繁请求的值。此方法将始终缓存 值范围为-128到127(包括),并可以缓存其他值 超出此范围。
答案 2 :(得分:0)
在您的情况下,您可以这样做:
selected.add(k);
因为自动装箱会创建一个Integer
对象,无论如何都要添加到List<Integer>
。
我认为这里获得的优势是你可以调用方法直接在k上修改k,而不必使用新的整数(k).someMethod
不,Integer
是不可变的(与所有原始包装类一样)。这些类是基元类型的包装器,主要用于集合中作为标准对象,并提供实用程序功能(例如,类型之间的转换)。
但是如果你关注表演(如果你在大名单上有算术),你应该知道装箱/拆箱以及何时使用int[]
与ArrayList<Integer>
。