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

时间:2016-07-04 05:53:57

标签: java autoboxing unboxing

以下内容之间有什么区别:

<?php header("Location:localhost/space/SPACE_V01.01.13/Source/Source_code/public/xxxx.php"); ?>

Integer in = (Integer)y;

我想将Integer in = new Integer(y);类型转换为int类型,反之亦然。这是我的代码:

Integer

3 个答案:

答案 0 :(得分:9)

简而言之,

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

详细的每个案例

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

Integer i = (Integer)10;

编译器理解10int原始类型,并且它必须由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

答案 1 :(得分: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)。

答案 2 :(得分: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。因此,如果您不需要,请不要使用它们。