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)
简而言之,
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)
如果您只想将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)
这是因为缓存了小整数(详情请参见此处).
| 归档时间: |
|
| 查看次数: |
1489 次 |
| 最近记录: |