在转换为原始类型或其包装类之间是否存在实际的性能差异?

时间:2013-10-30 04:54:20

标签: java performance casting wrapper primitive

我继承了代码相当复杂的代码,其返回类型为Object。根据输入,此方法表示保证返回不同类型(IntegerStringnull等)。我在保证返回Integer的情况下调用该方法。以下(显然)不编译:

int result;
result = foo(parameters);

编译器抱怨从Objectint的类型不匹配,以及它应该。但是,以下两行都编译:

result = (int) foo(parameters);
result = (Integer) foo(parameters);

我知道这两个电话都会做我想让他们做的事。 (就此而言,投射到shortShort会有效。)我的问题是:这两个投射之间是否存在实际差异 来电,并且在最佳实践性能方面优于其他?为了澄清,我知道原语和包装器之间的区别,它们的内存使用情况,null的能力等等。我只询问来自Object施放

据我了解,两次调用都将遵循相同的步骤:1)将Object投射到Integer(必要时抛出ClassCastException),2)提取来自int的{​​{1}}。

如果那里有重复的问题,我道歉。我搜索了它,但毫无疑问,我发现了从Integer转换为Object的问题。

2 个答案:

答案 0 :(得分:2)

实际上,使用intInteger之间的效果差异不大。一个在技术上更快作为基元,并且有一个有用的类相关方法,你可以使用。

就“投射”而言,如果foo()在其方法代码中返回Integer,那么在投放到Integer时会有0个性能损失,因为Object } return已经是Integer

如果foo()返回int,则将其投放到基元会有一点费用,但没有什么值得注意的。

public Object fooInt() {
    return 5;
}
public Object fooInteger() {
    return new Integer(5);
}

Integer integerResult = (Integer)fooInteger(); //No cost
integerResult = (Integer)fooInt(); //Small casting cost

int intResult = (int)fooInteger(); //Small casting cost
intResult = (int)fooInt(); //No cost

相反,看一下使用intInteger对后来对结果对象的处理方式是否更有用。在Java中,将int转换为Integer的成本完全可以忽略不计。

答案 1 :(得分:0)

原始值在性能方面是有效的,这就是为什么它们是原始的。虽然在对象的情况下,它们使用更多内存但使用起来非常方便,并提供了非常有用的API。