2011-08-10 84 views
5

Java的Collections.checked *()api爲我們提供了對底層集合的類型安全視圖。但是這些檢查發生在運行時並拋出一個運行時異常,這可能會導致性能代價高昂。通過使用泛型集合爲這些集合提供特定的類型,可以在編譯時強制執行相同的類型檢查。那麼在有些情況下,Collections.checked *()在指定類型時比泛型集合的得分高嗎?Java Collections.checked *()與通用集合

回答

10

的Javadoc解釋說得好:

http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#checkedCollection%28java.util.Collection,%20java.lang.Class%29

在語言中的泛型機制提供了編譯時(靜態)類型檢查,但是有可能戰勝這一機制選中轉換。通常這不是問題,因爲編譯器在所有這些未經檢查的操作上發出警告。然而,有些時候,靜態類型檢查本身是不夠的。例如,假設一個集合被傳遞給第三方庫,並且必須通過插入錯誤類型的元素來避免庫代碼破壞集合。

0

在新的1.5+項目中使用帶有未檢查類型的舊庫時。

+1

因爲你碰巧在金融公司工作,當你需要乞求改變一個圖書館,並面對幾個月的官僚過程。是的,你是對的,我應該得到一個更好的工作.... –

5

主要區別在於編譯時檢查可以很容易地被意外和有意地繞過。

編譯器警告你,如果出現這種情況,但警告很容易被忽略,問題可能在一些地方圖書館發生。泛型提供的類型信息是可靠,但是只有如果涉及的所有代碼都編譯時沒有任何有關泛型的警告:沒有未檢查的轉換,沒有原始類型。

使用Collections.checked*()爲您提供了一種強制執行限制的方法,即使使用超出控制範圍的代碼(只要您可以傳入您自己的集合)。

1

Collectons.checkedXxxxx()執行運行時檢查提供了額外的安全性。可以通過使用類型擦除來避免編譯器,但是檢查的集合應始終檢查類型是否正確。

我懷疑性能差異是否足以擔心。它很可能是大約10納秒或更少。