Типы коллекций ArrayList и List
Объекты System.Collections.ArrayList или System.Collections.Generic.List<T> являются сложными версиями массива. Класс ArrayList и универсальный класс List<T> предоставляет некоторые возможности, предлагаемые в большинстве классов System.Collections, но не в классе Array. Пример.
Вместимость Array фиксирована, в то время как вместимость ArrayList или List<T> автоматически увеличивается по мере необходимости. При изменении значения свойства ArrayList.Capacity перераспределение памяти и копирование элементов выполняется автоматически.
ArrayList и List<T> предоставляют методы для добавления, вставки или удаления диапазона элементов. В Array можно получить или изменить значение только одного элемента за раз.
Синхронизированную версию ArrayList легко создать с помощью метода Synchronized; однако, такой тип синхронизации относительно неэффективен. В классах Array и List<T> синхронизация осуществляется пользователем. Пространство имен System.Collections.Concurrent не обеспечивает параллельный тип списка, но обеспечивает тип ConcurrentQueue<T> и ConcurrentStack<T>.
ArrayList и List<T> предоставляют методы, возвращающие в коллекцию программы-оболочки фиксированного размера и только для чтения. В Array такие методы отсутствуют.
С другой стороны, Array предлагает некоторую гибкость, которой не обладают ArrayList и List<T>. Например:
Можно установить нижнюю границу Array, но нижняя граница ArrayList или List<T> всегда равна нулю.
В Array поддерживается несколько измерений, но ArrayList и List<T> всегда имеют точно одно измерение. Однако можно легко создать список массивов или список списков.
Объект Array определенного типа (отличного от типа Object) обеспечивает лучшую производительность по сравнению с ArrayList. Это происходит потому, что элементы объекта ArrayList имеют тип Object; следовательно, при сохранении или извлечении типа значения происходит упаковка или распаковка. Однако List<T> может иметь сравнимую производительность с массивом аналогичного типа, если не происходит перераспределения, то есть если исходная емкость довольно хорошо соответствует максимальному размеру списка.
В большинстве случаев, в которых требуется использовать массив, можно использовать ArrayList или List<T>, поскольку они более просты в применении и в целом имеют производительность, сравнимую с массивом объектов аналогичного типа.
Array находится в пространстве имен System. ArrayList находится в пространстве имен System.Collections. List<T> находится в пространстве имен System.Collections.Generic.