Емкость - это то, что вы описали, - непрерывная память, выделенная ArrayList для хранения значений. ArrayList сохраняет все значения в массиве и автоматически изменяет размер массива для вас. Это влечет за собой накладные расходы на управление памятью при изменении размера.
Если я правильно помню, Java увеличивает размер резервного массива ArrayList с размера N до размера 2N + 2, когда вы пытаетесь добавить еще один элемент, чем может вместить емкость. Я не знаю, до какого размера он увеличивается, когда вы используете метод insert
(или аналогичный) для вставки в определенную позицию за пределами емкости, и даже позволяет ли он это.
Вот пример, который поможет вам подумать о том, как это работает. Представьте каждое пространство между |
как ячейку в резервном массиве:
| | |
размер = 0 (не содержит элементов), емкость = 2 (может содержать 2 элемента).
|1| |
размер = 1 (содержит 1 элемент), емкость = 2 (может содержать 2 элемента).
|1|2|
размер = 2, емкость = 2. Добавление еще одного элемента:
|1|2|3| | | |
размер увеличен на 1, вместимость увеличена до 6 (2 * 2 + 2). Это может быть дорого с большими массивами, так как выделение большой непрерывной области памяти может потребовать немного работы (в отличие от LinkedList, который выделяет много маленьких частей памяти), потому что JVM необходимо искать подходящее место и, возможно, потребуется запросить у ОС дополнительную память. Также дорого стоит копировать большое количество значений из одного места в другое, что будет сделано после того, как такая область будет найдена.
Мое эмпирическое правило таково: если вы знаете, какая емкость вам потребуется, используйте ArrayList, потому что будет только одно выделение, а доступ будет очень быстрым. Если вы не знаете требуемую емкость, используйте LinkedList, потому что добавление нового значения всегда требует одинакового объема работы и не требует копирования.
person
Jonathan
schedule
23.03.2011
int newCapacity = (oldCapacity * 3)/2 + 1;
- person bestsss   schedule 23.03.2011