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

2022-09-04 01:32:55

以下有什么区别:

Integer in = (Integer)y;

Integer in = new Integer(y);

我想将类型转换为类型,反之亦然。以下是我执行此操作的代码:intInteger

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");
    }
  }
}

答案 1

如果您只想将基元转换为对象,则有四个选项intInteger

   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
}

这是因为缓存了小整数(详细信息如下)。


答案 2

简言之,

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

每个案例的详细情况

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

Integer i = (Integer)10;

编译器理解这是一种基元类型,并且必须由其包装才能进行编译。似乎javac会做以下事情:10intInteger

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

但是编译器足够聪明,可以做不必要的转换,只是会被省略:(Integer)

Integer i = Integer.valueOf(10);

接下来,是实例创建的情况。

Integer i = new Integer(10);

这里很简单。无论如何,将创建一个新的类实例。但是,正如文档所说,通常,这不是合适的方法:Integer

很少适合使用这些构造函数。静态工厂通常是更好的选择,因为它可能会产生更好的空间和时间性能。valueOf()

结论

在日常代码编写中,我们通常使用自动装箱和取消装箱。它们是基元类型及其相应的对象包装类之间的自动转换(已在 Java 5 中引入)。所以你不需要考虑太多的方法。这太方便了,不是吗?Xxx.valueOf(xxx).xxxValue()

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

推荐