当前位置: 首页 > 知识库问答 >
问题:

如果数组列表在内部使用Object[]Array,它是如何异构的

农波涛
2023-03-14

arraylist在内部使用对象[]数组,该数组是同构的,那么arraylist是如何异构的

以下内容在运行时引发异常:

Object[] array = new String[3];
array[0] = "a";
array[1] = 1;   // throws java.lang.ArrayStoreException

不像下面的编译和运行没有问题

ArrayList list = new ArrayList<String>();
list.add("a");
list.add(1);    // works
list.add(new Object());  // works

共有3个答案

冉弘化
2023-03-14

由于它持有Object,它是所有类的父类,因此最终我们将同构变为异构。这不是定义数组表的理想方式。但技术上我们可以做到。

钱宇
2023-03-14

泛型是Java语言的编译时特性。在运行时,所有定义的泛型类型都被视为对象类型。因此,使用对象[]作为支持列表非常有意义。

将这两个编译为同样的事情(相同的字节码):

ArrayList<String> list = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();

另一方面,数组类型在编译和运行时是一致的。编译后会产生不同的字节码:

String[] arr = new String[];
Integer[] arr = new Integer[];
章建木
2023-03-14

数组列表的后备数组是一个对象[],即该数组的元素类型是对象类,而不是对象的任何子类,因此可以在其中放置任何引用类型(以及自动装箱到相应包装类型的原语)。

以下不会引发异常:

Object[] array = new Object[3];
array[0] = "a";
array[1] = 1;

您可以在ArrayList构造函数中看到后备数组的初始化:

public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity]; // here
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}
 类似资料:
  • 问题内容: 我需要知道是否将数据存储在ArrayList中,并且需要获取存储在其中的值。 例如:如果我有这样的数组列表 我想获取每个String元素,该怎么办? 我尝试通过以下代码来做到这一点: 问题答案: 以下代码段提供了一个示例,展示了如何从指定索引处的元素中获取元素,以及如何使用高级的for-each循环遍历所有元素: 请注意以下几点: 使用泛型和类型代替原始类型。 变量名以小写字母开头 被

  • 我很难弄清楚如何在pact合同中的数组中表示具有不同结构对象的数组。 来自pact-spec-v3 我目前拥有的代码:

  • 问题内容: 我正在解析的API返回大小为1的数组的对象时遇到问题。 例如,有时API会响应: 但是,如果数组只有1个项目,它将变成一个对象(请注意缺少括号),如下所示: 如果我这样定义模型,则仅返回单个项目时会出现错误: 如果仅返回单个项目,则会出现以下错误: 如果我这样定义我的模型: API返回一个数组我得到了相反的错误 我无法在模型中定义多个具有相同名称的项目。我该如何处理? 注意:我无法更改

  • 问题内容: 我想知道Swift如何在内部管理数组?Apple的语言指南仅处理用法,而未详细说明内部结构。 作为一名Java开发人员,我习惯于将“裸”数组视为一种非常静态和固定的数据结构。我知道这在Swift中是不正确的。除了Java之外,在Swift中,您可以更改数组的长度,还可以执行插入和删除操作。在Java中,我习惯于根据要对该结构执行的操作来决定要使用哪种数据结构(简单数组,ArrayLis

  • 根据SCJP的数组列表。大小应该取决于可用内存的大小,但是list.getSize()返回一个整数。假设< code >整数。MAXSIZE是最大值。阵列容量。即int最大允许值

  • 问题内容: 我们将注释定义为接口,如下所示 而且我们知道所有注释默认都会扩展接口。 当我检查接口的Java库时,我发现它覆盖了Object类等许多方法。 如果Annotation是一个接口,那么它如何扩展Object类并覆盖其方法?接口只能扩展其他接口,不能扩展类。 问题答案: 所以我的问题是,如果Annotation是一个接口,那么它将如何扩展Object类并覆盖其方法 不完全是。Java语言规