【发布时间】:2013-07-19 17:20:54
【问题描述】:
我知道,当 Java 编译器编译泛型类型时,它会执行类型擦除并从代码中删除对泛型的所有引用,我的 ArrayList<Cheesecake> 变成了 ArrayList。
我没有明确答案的问题是,缺少类型(因此强制类型转换)是否会导致速度变慢。换句话说,如果我使用的是标准 Java 编译器和 Oracle 的标准 JVM 1.7:
- 字节码是否包含类型转换?
- 如果是,是否包含运行时检查以检查其类型是否正确?
- 转换本身是否需要大量时间?
- 会创建我自己的
CheesecakeList类,看起来与ArrayList相同,只是将所有Objects 都转换为Cheesecakes 我会得到什么(再次只是一个假设,我对任何一个都不感兴趣由于更多的类或我的代码中的重复,拥有更大的二进制文件的副作用)。
我对类型擦除导致的任何其他问题不感兴趣,只是一个比我更了解 JVM 的人的简单回答。
我最感兴趣的是这个例子中的成本:
List<Cheesecake> list = new ArrayList<Cheesecake>();
for (int i = 0; i < list.size(); i++)
{
// I know this gets converted to ((Cheesecake)list.get(i)).at(me)
list.get(i).eat(me);
}
与以下相比,在循环内进行转换是否昂贵和/或重要:
CheesecakeList list = new CheesecakeList();
for (int i = 0; i < list.size(); i++)
{
//where the return of list.get() is a Cheesecake, therefore there is no casting.
list.get(i).eat(me);
}
免责声明:这主要是学术好奇心的问题。我真的怀疑类型转换是否存在任何重大的性能问题,如果我在代码中发现性能错误,那么消除对它们的需求甚至不会是我会做的前 5 件事之一。如果您正在阅读本文是因为您确实遇到了性能问题,请帮自己一个忙,并启动一个分析器并找出瓶颈在哪里。如果你真的相信它的类型转换,那么你才应该尝试以某种方式优化它。
【问题讨论】:
标签: java performance generics