使用新的整数(a)优于a

时间:2015-04-20 14:57:57

标签: java

说我有一些代码

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;,但这是否是这里获得的唯一优势?

3 个答案:

答案 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>