以下是有什么区别的:
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");
}
}
}
如果你想要做的就是将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)。
简而言之,
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
对于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。因此,如果您不需要,请不要使用它们。