2016-04-18 2 views
7

Wenn wir einen Typ [] haben, können wir nur Typ oder seine Subtypen darin speichern. Das Gleiche gilt für ArrayList. Warum heißt es, dass man homogen ist, während das andere nicht ist?Was bedeutet es, dass Java-Arrays homogen sind, ArrayLists aber nicht?

+5

Wer hat Ihnen gesagt, ArrayLists sind inhomogen? Solange Sie die Generika nicht umgehen, sind sie genauso homogen wie Arrays. (Wenn Sie die Generika * umgehen *, dann sollten Sie wahrscheinlich mit 'Object []' vergleichen.) – user2357112

+2

Ich möchte, dass dies die Antwort ist. – totoro

+0

Jedes Element eines Arrays muss vom selben primitiven Typ oder vom gleichen Referenztyp sein. Jedes Element einer ArrayList muss denselben Referenztyp haben. –

Antwort

10

Arrays haben eine Laufzeitprüfung auf den Typ des hinzugefügten Elements. Das heißt, wenn ein neues Element, das nicht vom selben Typ ist, hinzugefügt wird, wird zur Laufzeit ein ArrayStoreException geworfen. Deshalb gelten sie als "homogenen".

Dies gilt nicht für ArrayList s (List s im Allgemeinen). Durch die Art des Löschens zur Laufzeit kann es praktisch jedes Objekt halten.

Die folgende löst eine Ausnahme bei der Ausführung:

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

im Gegensatz zu den folgenden, die problemlos und läuft kompiliert (wenn auch mit einem Compiler-Warnung, da es nicht ordnungsgemäß Generika verwenden ist):

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

Bei korrekter Verwendung von Generika, dh Deklarieren der Variablen list über dem Typ ArrayList<String> anstelle von ArrayList, wird das Problem zur Kompilierungszeit vermieden:

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

Aber auch mit einer allgemein erklärt Liste können Sie so etwas wie diese Arbeit ohne Ausnahme zur Laufzeit haben:

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

Ausgang:

ein

+0

Könnten Sie das "Umgehen von Generika" einbetten und mit Generika zeigen, dass es tatsächlich homogen in die Antwort ist? – totoro

+0

"Die folgenden kompiliert und läuft ohne Probleme" Während dies kompiliert wird, erhalten Sie eine Warnung während der Kompilierung. – Powerlord

0

Ja. JavaArrays sind homogen, denn wenn Sie ein Array in Java deklarieren, müssen Sie seine type deklarieren. zB:

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

jetzt, wenn Sie anderen Datentyp in deklarierten Array zu speichern versuchen, wird es eine Kompilierung Fehler. zB:

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

aber ArrayList der Collection ist ein Teil sind, halten sie Objects, anstelle eines bestimmten data-type [wenn wir nicht über generics reden], und weil alles, was in Java direkt oder indirekt geerbt von Objectclass, so wird es nicht geben Sie compile-time error, Typ Überprüfung wird auf run-time sein.

zB:

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. 

Jetzt bemerken Sie haben, weil wir keinen Datentyp ArrayList al definiert haben, aber immer noch verschiedene Arten Werten wir speichern: Das ist, warum ArrayList Stores Object keine spezifischer Datentyp daher sind sie heterogen, nicht homogen.