Java中数组与集合的运行时安全性

Java中数组与集合的运行时安全性,java,arrays,generics,arraylist,collections,Java,Arrays,Generics,Arraylist,Collections,集合不提供运行时安全,它们只提供编译时安全。 但是我读到数组提供了运行时和编译时的安全性 由于列表构建在数组之上,因此它们也可以提供运行时安全性。但为何不提供这项服务呢 如果我们查看ArrayList的源代码,数组声明如下: 不能改成 private transient T[] elementData; 声明它T[]不会使它在运行时被检查,因为在运行时T参数被删除并减少到最低界限,即Object,因此它实际上是Object[] 这是因为Java实现了带擦除的泛型,所以相同的.class文件用

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

由于列表构建在数组之上,因此它们也可以提供运行时安全性。但为何不提供这项服务呢

如果我们查看ArrayList的源代码,数组声明如下:

不能改成

private transient T[] elementData;

声明它
T[]
不会使它在运行时被检查,因为在运行时T参数被删除并减少到最低界限,即Object,因此它实际上是
Object[]

这是因为Java实现了带擦除的泛型,所以相同的.class文件用于
ArrayList
以及
ArrayList
。这意味着,在编译后,它们在JVM内存中是相同的


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

两者之间没有功能上的区别。但是,如果您想要运行时安全,请查看Java感谢您让我知道这一点。当您将数组声明为
MyClass[]
时,它在运行时仅限于包含MyClass对象。当您声明
ArrayList
时,它可以在运行时包含任何类型的对象。从这个意义上讲,阵列“更安全”。列表不提供运行时安全性的原因是,无论您指定的泛型类是什么,其中的数组始终是一个
对象[]
。实际上有一些方法可以实现类型安全数组,而不需要“大量反射”,但Java collection并不是为此而设计的。这在实践中并不是什么大不了的事——一个经过检查的收藏足够有效。当然它们有效,我的回答主要是让他理解为什么不提供它的动机,这就是他所要求的IIUC。谢谢你向我解释Simone的内部结构。
private transient T[] elementData;