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

问题描述 投票:14回答:3

以下是有什么区别的:

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");
    }
  }
}
java autoboxing unboxing
3个回答
9
投票

如果你想要做的就是将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)。


9
投票

简而言之,

  • 线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类实例。但是,正如文档所说,通常,这是不恰当的方式:

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

结论

在日常代码编写中,我们通常使用autoboxing and unboxing。它们是原始类型与其对应的对象包装类之间的自动转换(已在Java 5中引入)。因此,您无需考虑Xxx.valueOf(xxx).xxxValue()方法。这么方便,不是吗?

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

4
投票

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

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

要么

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

您主要是在原始类型和包装类之间进行转换。但Java有一个名为Auto Boxing and Unboxing的功能,java将为你做这些演员。写吧

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

Autoboxing和Unboxing降低了性能。 Primitives seems to be 2-3 times faster then it’s Integer equivalent。因此,如果您不需要,请不要使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.