强制转换为基元类型或其包装类之间是否存在实际性能差异



我继承了具有相当复杂方法的代码,其返回类型为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) 从该Integer中提取int

如果有重复的问题,我深表歉意。 我搜索了它,但我找到的问题没有回答从Objectint铸造的问题。

实际上,使用 intInteger 之间的性能差异没有太大差异。一个作为基元在技术上更快,另一个具有您可以使用的有用的类相关方法。

就"强制转换"而言,如果foo()在其方法代码中返回一个Integer,则在转换为Integer时将有0的性能损失,因为返回的Object已经是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的成本完全可以忽略不计。

基元值在性能方面是有效的,这就是它们被设为基元的原因。而在对象的情况下,它们使用更多的内存,但在使用中非常方便,并提供了一个非常有用的API。

相关内容

最新更新