0

案例一:

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

案例B:

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

以上哪个会更快?

在案例 B 中,我假设动态转换发生在整个循环中。所以,我的假设是第二个可能比第一个慢。

请说哪一个可以让我更快?

4

4 回答 4

1

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

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

于 2013-03-04T09:32:53.220 回答
1

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

于 2013-03-04T09:33:09.527 回答
1

首先,泛型是一个编译时特性。Java 运行时与泛型无关。我建议您使用案例 A,因为您始终确定 List 将仅包含 String 对象而没有其他内容。这将帮助您在运行时避免 ClassCastException,因为您始终确信 List 将只包含 String 对象而没有其他任何内容。

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

于 2013-03-04T09:40:32.680 回答
1

一旦你得到了它们的字节码,你会发现它们都是一样的。So there is no change of performance in both of them .

于 2013-11-19T20:35:12.890 回答