Что такое List<T> и чем отличаются Count и Capacity? List<T> — динамический обобщённый массив в .NET Count — фактическое количество элементов, значение хранится явно Capacity — объём внутреннего массива, зарезервированного для элементов При добавлении объектов Count растёт, а Capacity увеличивается только после заполнения массива, обычно в 2 раза Count всегда не превышает Capacity, поскольку дополнительное место резервируется заранее для оптимизации Значение Count считывается за O(1), а Capacity показывает текущий доступный размер без нового перераспределения Коллекция хранит данные эффективно и расширяется динамически, не копируя массив…
Что такое List<T> и чем отличаются Count и Capacity?
Что такое List<T> и чем отличаются Count и Capacity? List<T> — динамический обобщённый массив в .NET Count — фактическое количество элементов, значение хранится явно Capacity — объём внутреннего массива,…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Что такое List<T> и чем отличаются Count и Capacity?
- List<T> — динамический обобщённый массив в .NET
- Count — фактическое количество элементов, значение хранится явно
- Capacity — объём внутреннего массива, зарезервированного для элементов
- При добавлении объектов Count растёт, а Capacity увеличивается только после заполнения массива, обычно в 2 раза
- Count всегда не превышает Capacity, поскольку дополнительное место резервируется заранее для оптимизации
- Значение Count считывается за O(1), а Capacity показывает текущий доступный размер без нового перераспределения
- Коллекция хранит данные эффективно и расширяется динамически, не копируя массив при каждом добавлении
Подробный ответ
Основной ответ
List<T> — обобщённая коллекция пространства имён System.Collections.Generic в .NET. По сути, это динамический массив, способный автоматически увеличивать свой размер при добавлении новых элементов. Коллекция размещает значения последовательно в памяти, обеспечивая быстрый доступ по индексу и эффективное добавление в конец.
Свойство Count показывает, сколько элементов в данный момент фактически содержится в списке.
Свойство Capacity задаёт размер внутреннего массива, используемого для размещения элементов. Его значение может отличаться от Count: List<T> обычно резервирует некоторый запас памяти, чтобы реже выполнять перераспределение.
Ключевые моменты
- Реализация Count: публичное свойство возвращает внутреннее поле с точным количеством добавленных элементов. Получение Count выполняется за O(1).
- Реализация Capacity: свойство соответствует длине внутреннего массива (T[]), выполняющего роль буфера. Когда при добавлении Count достигает Capacity, вместимость, как правило, увеличивается в 2 раза, благодаря чему дорогостоящие аллокации происходят реже.
- Расширение массива: если текущего места недостаточно, List создаёт новый массив увеличенного размера, переносит в него существующие данные и заменяет ссылку на старый массив. За счёт этого амортизированная сложность вставки сохраняется на уровне O(1).
Практический контекст
В прикладных проектах нередко стоит заранее контролировать Capacity, чтобы сократить количество аллокаций, особенно при загрузке больших объёмов данных, например во время десериализации. Для этого начальную вместимость можно указать в конструкторе List<T>, а методом TrimExcess — уменьшить Capacity до значения Count и освободить память. Такой способ повышает производительность и уменьшает фрагментацию памяти.