您好我很好奇执行以下类型的演员会有什么严重的表现后果吗?特别是当它的表现数百万次感谢
Object [] car = new Object[1];
car[0] = new Long[2][2];
long[][] values = (long[][]) car[0];
答案 0 :(得分:3)
Casting确实不是一个性能问题。这只是编译器知道如何处理对象的元数据。当然,如果它试图将对象用作错误的类型,那么你将获得ClassCastException
,这可能会导致性能问题。
答案 1 :(得分:0)
我会说性能问题是那种情况完全没有任何意义。你为什么要那样做?
答案 2 :(得分:0)
您编写的代码将导致类强制转换异常。抛出数百万个类强制转换异常可能会很慢。它也不太可能是预期的逻辑。
答案 3 :(得分:0)
强制转换的影响取决于你的jvm及其使用的代码。在现代jvms中应该高度优化强制转换操作,因为它经常用于泛型类,因此其开销应该非常低。
如果您的代码必须快速,您应该对其进行分析以找到瓶颈,如果演员在您的特定情况下出现问题,这也会回答。
答案 4 :(得分:0)
你无法进行以下演员表演。我建议你从一开始就让数组长[] [],你不需要转换数组类型。
// these won't work as these are different types of references.
long[] longs = (long[]) new Long[0];
long[][] longs = (long[][]) new Long[0][];
转换它们的唯一方法是迭代它们。
Long[][] longs = ...
long[][] longs2 = new long[longs.length][];
for(int i=0;i<longs.length;i++) {
longs2[i] = new long[longs[i].length];
for(int j=0;j<longs[i].length;j++) longs2[i][j] = longs[i][j];
}
主要的性能成本是首先创建Long [] [],因为你必须创建许多对象,而使用long [] []你只有数组使得结构对内存和cpu更有效。
答案 5 :(得分:0)
如果热点可以证明Object实际上很长[] [],则成本为none,否则需要检查+分支预测,这通常是成功的,并且它是一个额外的(只有一个)cpu周期。
投射不完全免费,就像其中一个答案所暗示的那样,它不仅仅是元数据。