Вопрос-ответ

Where is array's length property defined?

Где определено свойство длины массива?

Мы можем определить длину массива, ArrayList<E> используя его открытый метод size(), например

ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();

Аналогичным образом мы можем определить длину Array объекта, используя length свойство

String[] str = new String[10];
int size = str.length;

В то время как size() метод ArrayList определен внутри ArrayList класса, где определено это length свойство Array?

Переведено автоматически
Ответ 1

Массивы - это особые объекты в java, у них есть простой атрибут с именем, length который является final.

Для массива нет "определения класса" (вы не можете найти его ни в одном файле .class), они являются частью самого языка.


10.7. Элементы массива


Все элементы типа array являются следующими:



  • public final Поле length, которое содержит количество компонентов массива. length может быть положительным или нулевым.

  • public Метод clone, который переопределяет одноименный метод в классе Object и не создает проверяемых исключений. Тип возвращаемого значения clone метода типа массива T[] является T[].


    Клон многомерного массива является неглубоким, то есть создает только один новый массив. Подмассивы являются общими.


  • Все члены наследуются от класса Object; единственный метод Object, который не наследуется, - это его clone метод.



Ресурсы:

Ответ 2

По сути, оно "специальное", со своей собственной инструкцией по байт-кодированию: arraylength. Итак, этот метод:

public static void main(String[] args) {
int x = args.length;
}

компилируется в байт-код следующим образом:

public static void main(java.lang.String[]);
Code:
0: aload_0
1: arraylength
2: istore_1
3: return

Таким образом, к нему не обращаются, как к обычному полю. Действительно, если вы попытаетесь получить его, как если бы это было обычное поле, например, так, это не удастся:

// Fails...
Field field = args.getClass().getField("length");
System.out.println(field.get(args));

Итак, к сожалению, описание JLS каждого типа массива, имеющего общедоступное конечное поле length, несколько вводит в заблуждение : (

Ответ 3

Оно определено в спецификации языка Java:


Все элементы типа array являются следующими:



  • public final Поле length, которое содержит количество компонентов массива. length может быть положительным или нулевым.


Поскольку существует неограниченное количество типов массивов (для каждого класса существует соответствующий тип массива, а затем существуют многомерные массивы), они не могут быть реализованы в файле класса; JVM должна делать это на лету.

Ответ 4

Хотя это и не прямой ответ на вопрос, это дополнение к аргументу .length vs .size() . Я исследовал кое-что, связанное с этим вопросом, поэтому, когда я наткнулся на это, я заметил, что определения, представленные здесь


Общедоступное конечное поле length, которое содержит количество компонентов массива.


"не совсем" корректно.

Поле length содержит количество доступных мест для размещения компонента, а не количество компонентов, присутствующих в массиве. Таким образом, оно представляет общую доступную память, выделенную для этого массива, а не то, сколько этой памяти заполнено.

Распределение памяти массива

Пример:

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

Вывод:

Length of int[]:        5
Length of String[]: 5
Length of StuffClass[]: 5

Однако .size() свойство ArrayList действительно указывает количество элементов в списке:

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

Вывод:

List size:  0
List size: 1
List size: 2
2024-02-29 21:56 java arrays