Java 使用新整数(a)比使用

Java 使用新整数(a)比使用,java,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

说我有一些代码

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;
    }
公共列表索引(){
所选列表=新建ArrayList();
对于(int k=0;k

其中,如果卡片索引中的点不等于null,它将用一组整数填充名为selected的列表。我只是想知道使用
selected.add(newinteger(k))是否有什么好处,仅使用所选的
。添加(k)。我假设这里获得的优势是,您可以调用方法直接在k上修改k,而不必使用
newinteger(k),但这是这里获得的唯一优势吗?

自Java 5以来,有一种自动装箱功能,它将从一个基本变量自动创建对象包装类的实例。简而言之,没有,没有任何优势。

自Java 5以来,有一种自动装箱技术,它将从一个基本变量自动创建对象包装类的实例。简而言之,没有,没有优势。

唯一的“优势”(如果您愿意这样称呼的话)是
newinteger(a)
使Java的自动装箱显式可见

在您的情况下,这不是一个问题,但有些情况可能会令人困惑,特别是当您将类与原语混合使用时(Eclipse将自动装箱转换标记为错误/警告是有原因的)

相反,自动装箱将导致字节码中出现
Integer.valueOf(a)
,出于内存消耗和性能(cf.)的原因,通常优先于
new Integer(a)

公共静态整数值(int i)

返回表示指定int值的整数实例。如果 不需要新的整数实例,通常应使用此方法 优先于构造函数整数(int)使用,因为此方法是 可能通过以下方式产生显著更好的空间和时间性能 缓存频繁请求的值。此方法将始终缓存 范围为-128到127(含)的值,并且可以缓存其他值 在这个范围之外

唯一的“优势”(如果您愿意这样称呼的话)是
newinteger(a)
使Java的自动装箱显式可见

在您的情况下,这不是一个问题,但有些情况可能会令人困惑,特别是当您将类与原语混合使用时(Eclipse将自动装箱转换标记为错误/警告是有原因的)

相反,自动装箱将导致字节码中出现
Integer.valueOf(a)
,出于内存消耗和性能(cf.)的原因,通常优先于
new Integer(a)

公共静态整数值(int i)

返回表示指定int值的整数实例。如果 不需要新的整数实例,通常应使用此方法 优先于构造函数整数(int)使用,因为此方法是 可能通过以下方式产生显著更好的空间和时间性能 缓存频繁请求的值。此方法将始终缓存 范围为-128到127(含)的值,并且可以缓存其他值 在这个范围之外


在您的情况下,您可以简单地执行以下操作:

selected.add(k);
因为自动装箱将创建一个
整数
对象以添加到
列表

我假设这里获得的优势是,您可以调用方法直接在k上修改k,而不必使用新的整数(k)

不,
Integer
是不可变的(与所有基本包装类一样)。这些类是基本类型的包装器,主要作为标准对象在集合中使用,并提供实用功能(例如类型之间的转换)


但是如果你在意性能(如果你在大列表上有算术),你应该知道装箱/拆箱以及何时使用
int[]
ArrayList
相比

在您的情况下,您只需执行以下操作:

selected.add(k);
因为自动装箱将创建一个
整数
对象以添加到
列表

我假设这里获得的优势是,您可以调用方法直接在k上修改k,而不必使用新的整数(k)

不,
Integer
是不可变的(与所有基本包装类一样)。这些类是基本类型的包装器,主要作为标准对象在集合中使用,并提供实用功能(例如类型之间的转换)


但是如果你在意性能(如果你在大列表上有算术),你应该知道装箱/拆箱以及何时使用
int[]
ArrayList
相比

k
此处不能为空;Java编译器在装箱时要做的是调用
Integer.valueOf()
,而不是
newinteger()
。这里没有优点或缺点的问题:在Java中不能有
基元类型的集合
;Java编译器在装箱时要做的是调用
Integer.valueOf()
,而不是
newinteger()
。没有优劣之分:在Java中不能有
基元类型的集合
。更准确地说:创建一个实例或从缓存中重用一个实例。@ZhekaKozlov这对
整数
有效,AFAIK
Float
Double
没有缓存。更准确地说:创建一个实例或从缓存中重用一个实例。@ZhekaKozlov对
Integer
有效,AFAIK
Float
Double
没有缓存。