java 中的 (Integer)y 和 new Integer(y) 有什么区别?

What is the difference between (Integer)y and new Integer(y) in java?

以下有什么区别:

Integer in = (Integer)y;

Integer in = new Integer(y);

我想将 int 类型转换为 Integer 类型,反之亦然。这是我的代码:

public class CompareToDemo {

  public static void main(String[] args) {
    // Integer x=5;
    int y=25;

    System.out.println(y+" this is  int variable");

    Integer in = (Integer)y;

    //Integer in = new Integer(y);

    if(in instanceof Integer){
      System.out.println(in +" this is Integer variable");
    }
  }
}

简而言之,

  • Integer in = (Integer)y; 行使用了不必要的转换。
  • Integer in = new Integer(y); 创建了一个 Integer 实例。

每例详解

首先,让我们考虑显式转换的情况。

Integer i = (Integer)10;

编译器理解 10 是一个 int 原始类型,并且它必须被其 Integer 包装才能编译。看来 javac 会做以下事情:

Integer i = (Integer)Integer.valueOf(10);

但编译器足够聪明,可以进行不必要的强制转换,(Integer) 将被省略:

Integer i = Integer.valueOf(10);

接下来是创建实例的情况

Integer i = new Integer(10);

这里简单介绍一下。无论如何都会创建一个 Integer class 的新实例。但是,正如文档所说,通常情况下,这是不合适的方式:

It is rarely appropriate to use these constructors. The static factories valueOf() are generally a better choice, as it is likely to yield significantly better space and time performance.

结论

在日常代码编写中,我们通常使用autoboxing and unboxing。它们是原始类型和它们对应的对象包装器 classes 之间的自动转换(已在 Java 5 中引入)。所以你不必考虑 Xxx.valueOf(xxx).xxxValue() 方法。太方便了吧?

Integer i = 10; // autoboxing
int j = i; // unboxing

对于 java 中的每个 primitive type,都有一个对应的包装器 class。您可以在这些原始类型和相应的包装器之间进行转换 class。这称为 装箱和拆箱 。当你写

Integer in = (Integer)y; //this is unnecessary casting

Integer in = new Integer(y); //create a new instance of Integer class

您主要是在原始类型和包装器之间进行转换 class。但是 Java 有一个叫做 Auto Boxing and Unboxing 的功能,其中 java 会为你做这些转换。只写

int iPrimi = 20;
Integer iWrapper = iPrimi; //Autoboxing 
int iPrimi2 = iWrapper; //Auto unboxing

自动装箱和拆箱会降低性能。 Primitives seems to be 2-3 times faster then it’s Integer equivalent。因此,如果不需要,请不要使用它们。

如果您只想将 int 基元转换为 Integer 对象, 你有四个选择

   Integer in = (Integer)y;         // 1 explicit cast
   Integer in = y;                  // 2 implicit cast (autoboxing)
   Integer in = new Integer(y);     // 3 explicit constructor
   Integer in = Integer.valueOf(y); // 4 static factory method

这里最可取的方法是 2(自动装箱)。显式构造函数 (3) 不太可取,因为它可能会对性能造成一些小的影响。

另外,它们并不严格等价。考虑:

public static void main(String[] args) {
    int x = 25;
    Integer a = new Integer(x);
    Integer b = new Integer(x);
    System.out.println(a == b);     // false
    Integer c = Integer.valueOf(x);
    Integer d = Integer.valueOf(x);
    System.out.println(c == d);     // true
    Integer e = (Integer)x;
    Integer f = (Integer)x;
    System.out.println(e == f);     // true
}

这是因为缓存了小整数 (details here)。