Java数组是同构的是什么意思,但ArrayLists不是?

时间:2016-04-18 17:24:14

标签: java arrays arraylist data-structures collections

如果我们有一个Type [],我们只能在其中存储Type或其子类型。 ArrayList也是如此。那么为什么说一个是同质的而另一个不是呢?

2 个答案:

答案 0 :(得分:16)

数组对添加元素的类型进行运行时检查。也就是说,如果添加了不同类型的新元素,则会在运行时抛出ArrayStoreException。这就是为什么他们被视为" homegeneous"。

对于ArrayList s(一般为List s),情况并非如此。由于运行时类型擦除,它实际上可以容纳任何对象。

以下内容在运行时抛出异常:

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);    // OK
list.add(new Object());  // OK

正确使用泛型,即声明类型list之上的变量ArrayList<String>而不是ArrayList,在编译时避免出现问题:

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

但即使使用一般声明的列表,您也可以在运行时使用此类工作而不会出现异常:

ArrayList<String> list = new ArrayList<String>();
list.add("a");
Method[] methods = List.class.getMethods();
for(Method m : methods) {
    if(m.getName().equals("add")) {
        m.invoke(list, 1);
        break;
    }
}
System.out.println(list.get(0));
System.out.println((Object) list.get(1));

<强>输出:

  

     

1

答案 1 :(得分:2)

是的。Java Arrays是同类的,因为当您在Java中声明任何数组时,您必须声明其type。 例如:

int arr[]; //type is int
    String arr[]; //type is String
    float arr[]; //type is float

现在,如果您尝试在声明的数组中存储任何其他数据类型,则会出现编译时错误。 例如:

 int arr=new int[5];
     arr[0]="I am a String not int"; //compile time error

ArrayListCollection的一部分,他们持有Objects,而不是任何特定的data-type [如果我们不是在谈论generics] ,因为java中的所有内容都直接或间接地从Object class继承,所以它不会让compile-time error,类型检查在run-time上。

例如:

 ArrayList al=new ArrayList();//type is Object
    al.add("I am a String");  //Bacause String class in inherited from Object Class
    al.add(1);//the int 1 will first autobox into Integer class then stored in al ArrayList.Now bacause Integer class is also inherited from Object class,it will*/ allow you to store
    al.add(UserDefinedClass); //because every User defined class is also inherited from Object class,so it will also allow you.

现在您注意到了,因为我们尚未定义ArrayList al的任何数据类型,但我们仍然存储不同的类型值:这就知道为什么ArrayList存储Object不是特定数据 - 型,因此它们是异质的而不是同质的。