2016-04-18 12 views
7

Nếu chúng ta có Type [], chúng ta chỉ có thể lưu trữ Type hoặc các kiểu con của nó trong đó. Cũng vậy với ArrayList. Vì vậy, tại sao nó nói rằng một là đồng nhất trong khi người kia thì không?Có nghĩa là các mảng Java là đồng nhất, nhưng ArrayLists thì không?

+5

Ai nói với bạn ArrayLists là không đồng nhất? Miễn là bạn không bỏ qua các generics, chúng chính xác là đồng nhất như mảng. (Nếu bạn * làm * bỏ qua các generics, thì có lẽ bạn nên so sánh với 'Object []'.) – user2357112

+2

Tôi muốn đây là câu trả lời. – totoro

+0

Mọi phần tử của bất kỳ mảng nào phải là cùng loại nguyên thủy hoặc cùng một loại tham chiếu. Mỗi phần tử của một ArrayList phải là cùng một kiểu tham chiếu. –

Trả lời

10

Mảng có kiểm tra thời gian chạy trên loại phần tử được thêm vào. Nghĩa là, nếu một phần tử mới không thuộc cùng một loại được thêm vào, thì ArrayStoreException được ném vào thời gian chạy. Đó là lý do tại sao họ được coi là "đồng nhất".

Điều này không đúng đối với ArrayList s (List s nói chung). Do loại tẩy xoá trong thời gian chạy, nó thực tế có thể giữ bất kỳ đối tượng.

Sau đây ném một ngoại lệ khi chạy:

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

không giống như những điều sau đây mà biên dịch và chạy mà không có vấn đề (mặc dù với một cảnh báo trình biên dịch như nó không sử dụng đúng cách generics):

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

Với việc sử dụng chính xác các generics, tức là khai báo biến số list ở trên loại ArrayList<String> thay vì ArrayList, vấn đề có thể tránh được tại thời gian biên dịch:

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

Nhưng ngay cả với một danh sách tổng quát công bố, bạn có thể có một cái gì đó giống như công việc này mà không có một ngoại lệ trong thời gian chạy:

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

Output:

một

+0

Bạn có thể nhúng "bỏ qua các generics" và hiển thị với generics nó thực sự là đồng nhất vào câu trả lời? – totoro

+0

"Sau đây biên dịch và chạy mà không có vấn đề" Trong khi điều này sẽ biên dịch, bạn sẽ nhận được một cảnh báo trong khi biên dịch nó. – Powerlord

0

Có. JavaArrays là đồng nhất, bởi vì khi bạn khai báo bất kỳ mảng nào trong Java, bạn phải khai báo của nó type. ví dụ:

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

bây giờ nếu bạn cố gắng để lưu trữ bất kỳ dữ liệu kiểu khác trong mảng được khai báo, nó sẽ là một lỗi thời gian biên dịch. ví dụ:

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

nhưng ArrayList là một phần của 's Collection, họ giữ Objects, thay vì bất kỳ cụ thể data-type [nếu chúng ta không nói về generics], và vì tất cả mọi thứ trong java là trực tiếp hoặc gián tiếp thừa hưởng từ Objectclass, vì vậy nó sẽ không cung cấp cho bạn compile-time error, kiểm tra loại sẽ là run-time.

ví dụ:

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. 

Bây giờ cậu để ý, bởi vì chúng tôi chưa xác định bất kỳ kiểu dữ liệu của ArrayList al, nhưng chúng tôi vẫn đang lưu trữ các giá trị kiểu khác nhau: đây là biết tại sao ArrayList Stores Object không cụ thể dữ liệu kiểu , do đó chúng không đồng nhất không đồng nhất.

Các vấn đề liên quan