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?
Antwort
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
Ja. Java
Arrays
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 Object
class
, 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.
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
Ich möchte, dass dies die Antwort ist. – totoro
Jedes Element eines Arrays muss vom selben primitiven Typ oder vom gleichen Referenztyp sein. Jedes Element einer ArrayList muss denselben Referenztyp haben. –