Wir können die Länge eines ArrayList<E>
mit seiner öffentlichen Methode bestimmen size()
, wie z
ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();
Ebenso können wir die Länge eines Array
Objekts mithilfe der length
Eigenschaft bestimmen
String[] str = new String[10];
int size = str.length;
Während die size()
Methode von ArrayList
innerhalb der ArrayList
Klasse definiert ist , wo ist diese length
Eigenschaft von Array
definiert?
Antworten:
Arrays sind spezielle Objekte in Java, haben sie ein einfaches Attribut mit dem Namen ,
length
das istfinal
.Es gibt keine "Klassendefinition" eines Arrays (Sie können sie in keiner .class-Datei finden), sie sind Teil der Sprache selbst.
Ressourcen:
quelle
ArrayList.size()
die Anzahl der tatsächlich im Array gespeicherten Objekte angibt, währendmyArray.length
([]
) die "Kapazität" angibt. Das heißt, wenn fürmyArray = new int[10];
, wird 10 zurückgegeben. Dies ist nicht die Anzahl der Objekte, die Sie in das Array eingefügt haben.List
weil dies Arrays in ihren Implementierungen verwendet.Es ist im Grunde "speziell", mit einer eigenen Bytecode-Anweisung :
arraylength
. Also diese Methode:wird wie folgt in Bytecode kompiliert:
Es wird also nicht so zugegriffen, als wäre es ein normales Feld. In der Tat, wenn Sie versuchen, es so zu bekommen, als wäre es ein normales Feld wie dieses, schlägt es fehl:
Leider ist die JLS-Beschreibung jedes Array-Typs mit einem öffentlichen
length
Endfeld etwas irreführend :(quelle
int[]
wenn Generika nicht für primitive Typen gelten? (Und zum Teufel, Generika gab es sowieso lange nicht.) Sie könnten ohne Arrays davonkommen, indem Sie verknüpfte Listen für alle Sammlungen verwenden, aber es wäre für die Effizienz schrecklich.StringBuffer
Klasse selbst tut es, ja - weil sie einen Verweis auf a enthältchar[]
(oder zumindest tat; ich weiß nicht, ob dies immer noch der Fall ist). Während aStringBuilder
für mehr Speicher verantwortlich ist, sind seine unmittelbare Größe und sein Layout festgelegt.Es ist in der Java-Sprachspezifikation definiert :
Da es eine unbegrenzte Anzahl von Array-Typen gibt (für jede Klasse gibt es einen entsprechenden Array-Typ und dann mehrdimensionale Arrays), können sie nicht in einer Klassendatei implementiert werden. Die JVM muss dies im laufenden Betrieb tun.
quelle
Obwohl dies keine direkte Antwort auf die Frage ist, ist es eine Ergänzung zum Argument
.length
vs..size()
Ich habe etwas im Zusammenhang mit dieser Frage recherchiert und als ich darauf stieß, bemerkte ich, dass die Definition (en) hier bereitgestellt wurdenist nicht "genau" richtig.
Die Feldlänge enthält die Anzahl der verfügbaren Stellen zum Einfügen einer Komponente, nicht die Anzahl der im Array vorhandenen Komponenten. Es stellt also den gesamten verfügbaren Speicher dar, der diesem Array zugewiesen ist, und nicht, wie viel von diesem Speicher gefüllt ist.
Beispiel:
Ausgabe:
Die
.size()
Eigenschaft vonArrayList
gibt jedoch die Anzahl der Elemente in der Liste an:Ausgabe:
quelle
null
Nicht-Null-Elementen zu unterscheiden. Aber die Unterscheidung funktioniert nicht. Schließlich kann dassize()
von (sagen wir) aList
auchnull
Werte enthalten.size
sich das Verhalten dynamisch verhält, währendlength
es sich um eine statische Eigenschaft handelt. Die Tatsache, dass der verbleibende nicht ausgefüllte Speicherplatz in einem Array auf " Nicht-Werte " (abhängig vom Typ) initialisiert wird, widerspricht diesem Punkt nicht wirklich.Es ist ein öffentliches Endfeld, das die Anzahl der Komponenten des Arrays enthält (Länge kann positiv oder Null sein).
Ein Array hat daher dieselben öffentlichen Felder und Methoden wie die folgende Klasse:
Weitere Infos unter
10.7 Array-Mitglieder
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
quelle
Wo ist diese Längeneigenschaft des Arrays definiert, um es so zu beantworten, wie es ist ? In einem besonderen
Object header
.Einfach über JOL zu sehen
Eine der Zeilen aus dieser Ausgabe lautet:
Normalerweise haben Objekte zwei Überschriften (mark und klass), Arrays haben eine weitere, die immer eine
4 bytes
Länge einnimmt, ebensosize
wie eineint
.quelle
Die Schlüsselwortlänge verhält sich wie ein definiertes Datenfeld. Bei Verwendung in einem Array können wir damit auf die Anzahl der Elemente in einem Array zugreifen. In Bezug auf String [] können wir die in der String-Klasse definierte Methode length () aufrufen. In Bezug auf ArrayList können wir die in ArrayList definierte size () -Methode verwenden. Beachten Sie, dass beim Erstellen einer Array-Liste mit ArrayList <> (Kapazität) die Anfangsgröße () dieser Array-Liste Null ist, da kein Element vorhanden ist.
quelle