Java 数组是同构的,而 ArrayList 不是同构的,这是什么意思?

问题描述 投票:0回答:3

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

java arrays arraylist data-structures collections
3个回答
27
投票

数组对添加元素的类型进行运行时检查。也就是说,如果添加了不同类型的新元素,则会在运行时抛出

ArrayStoreException
。这就是为什么他们被认为是“同质的”。

对于

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

运行时抛出异常如下:

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

输出:

a

1


3
投票

是的。

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

但是

ArrayList
Collection
的一部分,它们持有
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
不是特定的数据类型,因此它们不是异构的同质。


0
投票
import java.util.ArrayList
class ArrayDemo{
public static void main(String[] args){
    // ARRAYS ARE HOMOGENEOUS
    int[] arr = new int[2];
    arr[0] = 10;
    arr[1] = 10.2    // COMPILATION ERROR

    // BUT ARRAYLISTS ARE NOT
    ArrayList array = new ArrayList();
    array.add(Integer.valueOf(10));
    array.add(Double.valueOf(10.2));    // NO COMPILATION ERROR
}

}

© www.soinside.com 2019 - 2024. All rights reserved.