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

标签 java arrays generics arraylist collections

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

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

如果我们看一下 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/

相关文章:

java - 如何获取当前周和月的第一天?

使用指针发送数组的C项目

返回泛型类型的 Java 方法需要 @SuppressWarnings ("unchecked") 和 (T) new Result()

java - 全屏模式下的分隔线位置

java - 如何使用 Stash API 对修改后的文件运行 PMD?

python - 将列表切片到给定元素

java - 匿名方法使用泛型值作为参数

java - instanceof 和泛型的编译错误

java - CloudWatch Alarm 进入针对单个数据点的 ALARM

java - java 8 中要映射的对象数组列表