In Java musste frühzeitig eine Entwurfsentscheidung getroffen werden:
Sind Arrays primitiv? oder sind sie Objekte?
Die Antwort ist, weder wirklich ... noch beides, wenn man es anders betrachtet. Sie arbeiten ziemlich eng mit dem System selbst und dem Backend des JVM zusammen.
Ein Beispiel hierfür ist die Methode java.lang.System.arraycopy () , für die ein Array eines beliebigen Typs erforderlich ist. Daher muss das Array in der Lage sein, etwas zu erben , und das ist ein Objekt. Und Arraycopy ist eine native Methode.
Arrays sind auch in komisch , dass sie Primitiven halten können ( int
, char
, double
, etc ... , während die anderen Sammlungen nur Objekte halten kann. Schauen Sie zum Beispiel bei java.util.Arrays und die hässliche Seite des Gleichheits Methoden. Dies wurde gestellt in eine als nach Gedanken. deepEquals (Object [], Object []) wurde bis 1,5 , während der Rest der Klasse Arrays in 1.2 hinzugefügt wurde nicht hinzugefügt.
Da es sich bei diesen Objekten um Arrays handelt, können Sie einige Dinge ausführen , die sich im Speicher oder in der Nähe des Speichers befinden - etwas, das Java häufig vor dem Codierer verbirgt. Dies ermöglicht es, bestimmte Dinge schneller zu erledigen, wenn das Objektmodell größtenteils beschädigt wird.
Zu Beginn des Systems gab es einen Kompromiss zwischen Flexibilität und etwas Leistung. Die Leistung siegte und der Mangel an Flexibilität wurde in die verschiedenen Kollektionen eingewickelt. Arrays in Java sind ein dünn implementiertes Objekt über einem primitiven Typ (ursprünglich), der für die Arbeit mit dem System vorgesehen ist, wenn Sie es benötigen.
Zum größten Teil waren rohe Arrays Dinge, die die ursprünglichen Designer anscheinend nur im System zu ignorieren und zu verstecken versuchten. Und sie wollten, dass es schnell geht (frühes Java hatte einige Probleme mit der Geschwindigkeit). Es war eine Warze im Design, dass Arrays keine schönen Arrays sind, aber es war eine, die benötigt wurde, wenn Sie etwas so nah wie möglich am System verfügbar machen wollten. Übrigens haben auch die heutigen Sprachen des frühen Java diese Warze - man kann kein .equals()
Array auf C ++ machen.
Java und C ++ haben beide denselben Pfad für Arrays eingeschlagen - eine externe Bibliothek, die die erforderlichen Operationen für Arrays anstelle von Arrays ausführt ... und den Codierern vorschlägt, bessere native Typen zu verwenden, sofern sie nicht wirklich wissen, was sie tun und warum sie es sind mach es so.
Daher ist der Ansatz, .equals in ein Array zu implantieren, falsch, aber es ist der gleiche Fehler, den Codierer aus C ++ kannten. Wählen Sie also das am wenigsten Falsche in Bezug auf die Leistung - lassen Sie es als Implementierung von Object: Zwei Objekte sind genau dann gleich, wenn sie sich auf dasselbe Objekt beziehen.
Das Array muss eine primitive Struktur haben, um mit nativen Bindungen kommunizieren zu können - etwas, das dem klassischen C-Array so nahe wie möglich kommt. Im Gegensatz zu den anderen Grundelementen muss das Array jedoch als Referenz und damit als Objekt übergeben werden können. Es ist also eher ein Primitiv mit einigen Objekt-Hacks an der Seite und einigen Grenzüberprüfungen.