Java Collections.checked *()vs Generic collections

时间:2011-08-10 13:23:17

标签: java generics collections

Java的Collections.checked *()api为我们提供了基础集合的类型安全视图。但是这些检查在运行时发生,并引发运行时异常,这对性能来说代价很高。通过使用泛型集合为这些集合提供特定类型,可以在编译时强制执行相同的类型检查。那么有些情况下Collections.checked *()会对指定类型的泛型集合进行评分吗?

4 个答案:

答案 0 :(得分:10)

javadoc解释得很好:

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

  

该语言中的泛型机制提供了编译时(静态)类型检查,但是可以使用未经检查的强制转换来破坏此机制。通常这不是问题,因为编译器会对所有此类未经检查的操作发出警告。但是,有时单独进行静态类型检查是不够的。例如,假设一个集合被传递给第三方库,并且库代码必须通过插入错误类型的元素来破坏集合。

答案 1 :(得分:6)

主要区别在于,无论是意外还是有意识地都可以轻易地规避编译时检查。

编译器警告你,如果发生这种情况,但警告很容易被忽略,问题可能发生在某个某个库中。泛型提供的类型信息可靠,但如果涉及的所有代码都编译时没有任何与泛型相关的警告:没有未经检查的强制转换,没有原始类型。

使用Collections.checked*()为您提供了一种强制执行限制的方法,即使使用了您无法控制的代码(只要您可以传入自己的代码)。

答案 2 :(得分:1)

Collectons.checkedXxxxx()执行运行时检查提供额外的安全性。可以通过使用类型擦除来避免编译器,但是经过检查的集合应该始终检查类型是否正确。

我怀疑性能差异是否足以让人担心。它可能大约10 ns或更短。

答案 3 :(得分:0)

在新的1.5+项目中使用未经检查类型的旧库时。​​