如果arraylist内部使用Object [] Array,它是如何异构的

时间:2018-01-11 09:20:04

标签: java arrays arraylist

arraylist内部使用Object [] Array,它是同构的,然后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 个答案:

答案 0 :(得分:4)

ArrayList的后备数组是Object[](即该数组的元素类型是Object类,而不是Object的任何子类,所以你可以把任何引用类型(以及基元,它们自动装箱到它们相应的包装类型)。

以下内容不会引发异常:

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);
    }
}

答案 1 :(得分:0)

泛型是Java语言的编译时功能。在运行时,所有定义的泛型类型都被认为是VARCHAR(20)类型。因此,使用Object作为支持列表非常有意义。

将这两个编译成相同的东西(相同的字节码):

Object[]

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

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

答案 2 :(得分:0)

因为它持有Object,它是所有类的父类,所以最终我们将异构化为异构。这不是定义arraylist的理想方式。但从技术上讲,我们可以做到。