Java arraylist在内部使用Object[]数组时的异构性

Java arraylist在内部使用Object[]数组时的异构性,java,arrays,arraylist,Java,Arrays,Arraylist,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.

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
的支持数组是一个对象[],即该数组的元素类型是类,而不是的任何子类,因此您可以将任何引用类型以及原语放入其中,它们会自动装箱到相应的包装器类型

以下操作不会引发异常:

Object[] array = new Object[3];
array[0] = "a";
array[1] = 1;
您可以在构造函数中看到备份数组的初始化:

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);
    }
}
的支持数组是一个对象[],即该数组的元素类型是类,而不是的任何子类,因此您可以将任何引用类型以及原语放入其中,它们会自动装箱到相应的包装器类型

以下操作不会引发异常:

Object[] array = new Object[3];
array[0] = "a";
array[1] = 1;
您可以在构造函数中看到备份数组的初始化:

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

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

将这两个编译为相同的字节码:

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

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

将这两个编译为相同的字节码:

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

因为它持有的对象是所有类的父对象,所以最终我们将从同质变为异质。这不是定义arraylist的理想方法。但技术上我们可以做到

因为它持有的对象是所有类的父对象,所以最终我们将从同质变为异质。这不是定义arraylist的理想方法。但技术上我们可以做到

自动装箱/取消装箱但1不是stringnew String[3]不能包含Strings以外的任何内容可能的重复项您确实不应该在任何新代码中使用原始类型,如ArrayList。如果正确声明了list,则在尝试将错误类型的元素添加到list时会出现编译错误。autoboxing/Unboxing但1不是stringnew String[3]不能包含Strings以外的任何内容可能的重复项在任何新代码中都不应使用ArrayList之类的原始类型。如果您正确地声明了列表,那么在尝试向列表中添加错误类型的元素时,将出现编译错误。