【问题标题】:Runtime safety for Arrays vs Collections in JavaJava 中数组与集合的运行时安全性
【发布时间】:2014-11-19 15:34:38
【问题描述】:

集合不提供运行时安全,它们只提供编译时安全。 但我读到数组提供运行时和编译时安全性。

由于列表是建立在数组之上的,它们也可以提供运行时安全性。但是为什么不提供呢?

如果我们看一下 ArrayList 的源代码,数组声明如下: http://www.docjar.com/html/api/java/util/ArrayList.java.html

private transient Object[] elementData;

不能改成

private transient T[] elementData;

【问题讨论】:

  • 两者在功能上没有区别。但是,如果您想要运行时安全,请查看 Java 的 checked collection
  • 感谢您让我知道这一点。
  • 当您将数组声明为MyClass[] 时,它在运行时被限制为仅包含 MyClass 对象。当您声明 ArrayList<MyClass> 时,它可以在运行时包含任何类型的对象。从这个意义上说,数组“更安全”。列表不提供运行时安全性的原因是其中的数组始终是 Object[],无论您指定的泛型类如何。

标签: java arrays generics arraylist collections


【解决方案1】:

声明它T[] 不会在运行时检查它,因为在运行时 T 参数被擦除并减少到最低边界,即 Object,所以它实际上是 Object[] 无论如何。

这是因为 Java 实现了带擦除的泛型,因此ArrayList<String>ArrayList<Integer> 使用相同的.class 文件。这意味着,经过编译后,它们在 JVM 内存中是相同的。

要拥有“真正的”不同数组,即一个为String[],另一个为Integer[],这将为您提供运行时检查,您将需要两个不同的.class,或者至少需要大量使用反射放慢速度。

【讨论】:

  • 实际上有一些方法可以在没有“大量反射”的情况下实现类型安全的数组,但 Java 集合并不是为此而设计的。在实践中这没什么大不了的——检查集合就足够了。
  • 当然可以,我的回答主要是让他明白为什么没有提供它的动机,IIUC 就是他问的。
  • 感谢您向我解释 Simone 的内部结构。
猜你喜欢
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2016-12-24
  • 2014-03-25
  • 2018-11-19
相关资源
最近更新 更多