Мы можем определить длину 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) начальный размер() этого списка массивов равен нулю, так как нет элемента.