2013-03-04 68 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 .