Мы можем определить продолжительность 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
?
Ответы:
Массивы - это специальные объекты в Java, у них есть простой атрибут,
length
который называетсяfinal
.Не существует «определения класса» массива (вы не можете найти его ни в одном файле .class), они являются частью самого языка.
Ресурсы:
источник
ArrayList.size()
указывается номер объекта, фактически сохраненного в массиве, аmyArray.length
([]
) - «емкость». То есть, если дляmyArray = new int[10];
, он возвращает 10. Это не количество объектов, которые вы поместили в массив.List
потому что он использует массивы в своих реализациях.Это «специальный» в основном, со своей инструкцией байткода:
arraylength
. Итак, этот метод:компилируется в байт-код следующим образом:
Так что это не так, как если бы это было нормальное поле. В самом деле, если вы попытаетесь получить его так, как если бы оно было нормальным полем, например, это не сработает:
Так что, к сожалению, описание JLS каждого типа массива, имеющего открытое конечное поле
length
, несколько вводит в заблуждение :(источник
int[]
когда дженерики не применяются к примитивным типам? (И, черт возьми, дженерики в любом случае долгое время не существовали.) Вы можете обойтись без массивов, используя связанные списки для всех коллекций, но это было бы ужасно для эффективности.StringBuffer
Да, сам класс - да, потому что он содержит ссылку на achar[]
(или, по крайней мере, сделал; я не знаю, сохранил ли он до сих пор). Таким образом, хотя aStringBuilder
отвечает за больший объем памяти, ее непосредственный размер и расположение фиксированы.Это определено в спецификации языка Java :
Поскольку существует неограниченное количество типов массивов (для каждого класса есть соответствующий тип массива, а затем существуют многомерные массивы), они не могут быть реализованы в файле класса; JVM должна делать это на лету.
источник
Даже если это не прямой ответ на вопрос, это дополнение к аргументу
.length
против.size()
. Я исследовал что-то, связанное с этим вопросом, поэтому, когда я столкнулся с этим, я заметил, что определение (я) предоставлено здесьне "точно" правильно.
Длина поля содержит количество доступных мест для размещения компонента, а не количество компонентов, присутствующих в массиве. Таким образом, он представляет общий объем доступной памяти, выделенной этому массиву, а не объем этой памяти.
Пример:
Вывод:
Тем не менее,
.size()
свойствоArrayList
действительно дает количество элементов в списке:Вывод:
источник
null
ненулевыми элементами. Но различие не работает. В конце концов,size()
of (скажем)List
может также включатьnull
значения.size
ведет себя динамически, в то время какlength
является статическим свойством ... тот факт, что оставшееся незаполненное пространство в массиве инициализируется как " Не значения " (в зависимости от типа), на самом деле не противоречит этой точке.это открытое конечное поле, которое содержит количество компонентов массива (длина может быть положительной или нулевой)
Таким образом, массив имеет те же открытые поля и методы, что и следующий класс:
больше информации на
10.7 Члены массива
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
источник
Чтобы ответить, как есть, где определено это свойство длины массива ? В специальном
Object header
.Легко увидеть с помощью JOL
Одна из строк этого вывода будет:
Обычно объекты имеют два заголовка (mark и klass), у массивов есть еще один, который всегда занимает
4 bytes
длину, какsize
и aint
.источник
Длина ключевого слова действует как определенная область данных. При использовании в массиве мы можем использовать его для доступа к количеству элементов в массиве. Что касается String [], мы можем вызвать метод length (), определенный в классе String. Что касается ArrayList, мы можем использовать метод size (), определенный в ArrayList. Обратите внимание, что при создании списка массивов с помощью ArrayList <> (acity) начальный размер () этого списка массивов равен нулю, так как элемента нет.
источник