2013-03-04 43 views
0

方案A:动态铸造效果构架

List<String> MyList; 
while(index<100) { 
    MyList = MyObject.get(MyIndex); 
} 

案例B:

List MyList; 
while(index<100) { 
    MyList = (List<String>) MyObject.get(MyIndex); 
} 

哪上面会更快吗?

在情况B,我假设动态铸造发生在整个循环。所以,这是我的假设,第二个可能会比第一个慢。

请说哪一个能让我更快?

回答

1

Java泛型是一个编译时抽象。没有证据表明它们留在字节码中。他们只是简化开发,但不影响性能。在字节码中,您的第一个代码示例看起来与第二个示例完全相同。 Javac将只为你插入铸件。

1

两者在性能上应该相同。第一个版本确实创建了JVM转换指令,但它由编译器隐式添加。在这两种情况下,运行时操作都是对List的强制转换。通用类型在运行时不保留。

您可以通过检查字节码来验证该字节码,这两个版本应该是相同的。

1

首先泛型是一个编译时功能。 Java运行时间与泛型无关。我建议你和案例A一起去,因为你总是确信List只能保存String对象而没有别的。这将帮助您在运行时避免ClassCastException,因为您始终确信List仅包含String对象,而不包含任何其他内容。

我认为这两种方法都需要相同的执行时间,因为两种情况下Java运行时间已知的List对象是相同的(List MyList;)。在情况A中:列出MyList;将作为List MyList传递给JVM,与情况B相同。

1

一旦获得了它们的字节码,就会看到两者都是相同的。 So there is no change of performance in both of them .