Wir können die Länge eines ArrayList<E>
mit seiner öffentlichen Methode size()
bestimmen, wie
ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();
In ähnlicher Weise 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?
Arrays sind spezielle Objekte in Java. Sie haben ein einfaches Attribut mit dem Namen length
, das final
ist.
Es gibt keine "Klassendefinition" eines Arrays (Sie können es in keiner .class-Datei finden), sie sind Teil der Sprache selbst.
10,7. Array-Mitglieder
Die Mitglieder eines Array-Typs sind folgende:
- Das Feld
public
final
length
, das die Anzahl der Komponenten des Arrays enthält.length
kann positiv oder null sein.Die
public
-Methodeclone
, die die gleichnamige Methode in der KlasseObject
überschreibt und keine geprüften Ausnahmen auslöst. Der Rückgabetyp derclone
-Methode eines Array-TypsT[]
istT[]
.Ein Klon eines mehrdimensionalen Arrays ist flach, dh er erstellt nur ein neues Array. Subarrays werden gemeinsam genutzt.
- Alle Mitglieder der Klasse
Object
; Die einzige Methode vonObject
, die nicht vererbt wird, ist dieclone
-Methode.
Ressourcen:
Es ist im Grunde "speziell", mit einer eigenen Bytecode-Anweisung: arraylength
. Also diese Methode:
public static void main(String[] args) {
int x = args.length;
}
wird wie folgt in Bytecode kompiliert:
public static void main(Java.lang.String[]);
Code:
0: aload_0
1: arraylength
2: istore_1
3: return
Es wird also nicht auf ein normales Feld zugegriffen. Wenn Sie versuchen, es wie ein normales Feld zu erhalten, schlägt dies fehl:
// Fails...
Field field = args.getClass().getField("length");
System.out.println(field.get(args));
Leider ist die JLS-Beschreibung jedes Feldtyps mit einem öffentlichen abschließenden Feld length
etwas irreführend :(
Es ist in der Java-Sprachspezifikation definiert :
Die Mitglieder eines Array-Typs sind folgende:
- Das
public final
-Feldlength
, das die Anzahl der Komponenten des Arrays enthält.length
kann positiv oder null sein.
Da es eine unbegrenzte Anzahl von Arraytypen gibt (für jede Klasse gibt es einen entsprechenden Arraytyp und then gibt es mehrdimensionale Arrays), können sie nicht in einer Klassendatei implementiert werden. Die JVM muss es im laufenden Betrieb tun.
Obwohl dies keine direkte Antwort auf die Frage ist, ist es eine Ergänzung des Arguments .length
vs .size()
. Ich recherchierte etwas im Zusammenhang mit dieser Frage. Als ich darauf stieß, fiel mir auf, dass die Definitionen hier angegeben sind
Die öffentliche endgültige Feldlänge, die die Anzahl der Komponenten des Arrays enthält.
ist nicht "genau" richtig.
Die Feldlänge enthält die Anzahl vonverfügbaren Stellen, um eine Komponente zu platzieren, 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 belegt ist.
Beispiel:
static class StuffClass {
int stuff;
StuffClass(int stuff) {
this.stuff = stuff;
}
}
public static void main(String[] args) {
int[] test = new int[5];
test[0] = 2;
test[1] = 33;
System.out.println("Length of int[]:\t" + test.length);
String[] test2 = new String[5];
test2[0] = "2";
test2[1] = "33";
System.out.println("Length of String[]:\t" + test2.length);
StuffClass[] test3 = new StuffClass[5];
test3[0] = new StuffClass(2);
test3[1] = new StuffClass(33);
System.out.println("Length of StuffClass[]:\t" + test3.length);
}
Ausgabe:
Length of int[]: 5
Length of String[]: 5
Length of StuffClass[]: 5
Die .size()
-Eigenschaft der ArrayList
gibt jedoch die Anzahl der Elemente in der Liste an:
ArrayList<Integer> intsList = new ArrayList<Integer>();
System.out.println("List size:\t" + intsList.size());
intsList.add(2);
System.out.println("List size:\t" + intsList.size());
intsList.add(33);
System.out.println("List size:\t" + intsList.size());
Ausgabe:
List size: 0
List size: 1
List size: 2
es ist ein öffentliches abschließendes Feld, das die Anzahl der Komponenten des Arrays enthält (Länge kann positiv oder Null sein)
Ein Array hat also die gleichen öffentlichen Felder und Methoden wie die folgende Klasse:
class A implements Cloneable, Java.io.Serializable {
public final int length = X;
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e.getMessage());
}
}
}
mehr Infos unter
10.7 Array-Mitglieder
http://Java.Sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Die Schlüsselwortlänge verhält sich wie ein definiertes Datenfeld. Bei Verwendung in einem Array können wir darauf zugreifen, wie viele Elemente in einem Array vorhanden sind. In Bezug auf String [] können wir die in String-Klasse definierte length () -Methode 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 anfängliche Größe () dieser Array-Liste Null ist, da kein Element vorhanden ist.
Um es so zu beantworten, wie es ist: wo ist diese length-Eigenschaft von array definiert? In einem speziellen Object header
.
Leicht zu sehen über JOL
int [] ints = new int[23];
System.out.println(ClassLayout.parseInstance(ints).toPrintable());
Eine der Zeilen dieser Ausgabe wird sein:
OFFSET SIZE TYPE DESCRIPTION
16 4 (object header) 17 00 00 00 (00010111 00000000 00000000 00000000) (23)
Normalerweise haben Objekte zwei Header (mark und klass), Arrays haben einen weiteren, der immer 4 bytes
in der Länge belegt, da size
eine int
ist.