集合不提供运行时安全性,它们仅提供编译时安全性。 但我读到数组提供了运行时和编译时安全性。
由于列表是构建在数组之上的,因此它们也可以提供运行时安全性。但为什么没有提供呢?
如果我们看一下 ArrayList 的源代码,数组的声明如下: http://www.docjar.com/html/api/java/util/ArrayList.java.html
private transient Object[] elementData;
能不能改成
private transient T[] elementData;
最佳答案
声明T[]
不会在运行时检查它,因为在运行时 T 参数被删除并减少到最低界限,即对象,所以它实际上是 Object[]
无论如何。
这是因为Java实现了带有删除功能的泛型,因此ArrayList<String>
使用相同的.class文件。以及 ArrayList<Integer>
。这意味着,编译后,它们在 JVM 内存中是相同的。
拥有“真正的”不同数组,即String[]
合而为一Integer[]
在另一个为您提供运行时检查的情况下,您将需要两个不同的.class,或者至少需要大量使用反射,这会大大减慢速度。
关于java - Java 中数组与集合的运行时安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26028798/