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

Мы можем определить длину 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. Члены массива

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

  • Поле public final length, которое содержит количество компонентов массива. length может быть положительным или нулевым.
  • Метод public clone, который переопределяет метод с тем же именем в классе Object и не отменяет проверенных исключений. Возвращаемым типом метода clone типа массива T[] является T[].

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

  • Все члены, унаследованные от класса 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:

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

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

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

Ответ 4

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

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

не является "точно" правильным.

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

Array Memory Allocation

Пример:

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

Ответ 5

это публичное конечное поле, содержащее количество компонентов массива (длина может быть положительной или нулевой)

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

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

больше информации на

10.7 Члены массива

http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html

Ответ 6

Длина ключевого слова действует как заданная форма данных. При использовании в массиве мы можем использовать его для доступа к количеству элементов в массиве. Что касается String [], мы можем вызвать метод length(), определенный в классе String. Что касается ArrayList, мы можем использовать метод size(), определенный в ArrayList. Обратите внимание, что при создании списка массивов с ArrayList < > (capacity) начальный размер() этого списка массивов равен нулю, так как нет элемента.