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

sun*_*jan 14 java autoboxing unboxing

以下是有什么区别的:

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");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

And*_*lko 9

简而言之,

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

每个案例都详细说明

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

Integer i = (Integer)10;
Run Code Online (Sandbox Code Playgroud)

编译器理解这10是一种int原始类型,并且它必须由它包装Integer以使其编译.似乎javac将做以下事情:

Integer i = (Integer)Integer.valueOf(10);
Run Code Online (Sandbox Code Playgroud)

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

Integer i = Integer.valueOf(10);
Run Code Online (Sandbox Code Playgroud)

接下来,有实例创建的情况.

Integer i = new Integer(10);
Run Code Online (Sandbox Code Playgroud)

这一切都很简单.Integer无论如何都将创建一个新的类实例.但是,正如文档所说,通常,这是不恰当的方式:

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

结论

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

Integer i = 10; // autoboxing
int j = i; // unboxing
Run Code Online (Sandbox Code Playgroud)

  • "你不必考虑." - 只有反对意见.我并不认为VM会为你处理"肮脏"的工作 - **但是**你还需要知道发生了什么.就在前几天有一个问题,由于Integer池化机制,一个人搞乱了线程同步. (2认同)
  • @Fildor:使用`Integer`实例作为同步键无论如何都是一个破碎的设计,无论是否发生了池化. (2认同)
  • @Holger我同意.但这不是我的观点.我只是想说"你不必考虑"是**根本不是真的**._当然_你必须知道幕后还有一些Boxing/Unboxing.否则你迟早会遇到麻烦.同步问题的例子只是众多可想而知的例子之一. (2认同)

leo*_*loy 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
Run Code Online (Sandbox Code Playgroud)

这里最好的方法是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
}
Run Code Online (Sandbox Code Playgroud)

这是因为缓存了小整数(详情请参见此处).