A System.Collections.ArrayList or System.Collections.Generic.List object is a sophisticated version of an array. The ArrayList class and the List generic class provide some features that are offered in most System.Collections classes but that are not in the Array class. For example:
The capacity of an Array is fixed, whereas the capacity of an ArrayList or a List is automatically expanded as required. If the value of the ArrayList.Capacity property is changed, the memory reallocation and copying of elements are automatically done.
ArrayList and List provide methods that add, insert, or remove a range of elements. In Array, you can get or set the value of only one element at a time.
A synchronized version of ArrayList is easy to create by using the Synchronized method; however, this type of synchronization is relatively inefficient. The Array and List classes leaves it up to the user to implement synchronization. The System.Collections.Concurrent namespace does not provide a concurrent list type, but it does provide a ConcurrentQueue and ConcurrentStack type.
ArrayList and List provide methods that return read-only and fixed-size wrappers to the collection. Array does not.
On the other hand, Array offers some flexibility that ArrayList and List do not. For example:
You can set the lower bound of an Array, but the lower bound of an ArrayList or a List is always zero.
An Array can have multiple dimensions, but an ArrayList or a List always has exactly one dimension. However, you can easily create a list of arrays or a list of lists.
An Array of a specific type (other than Object) provides better performance than an ArrayList. This is because the elements of ArrayList are of type Object; therefore, boxing and unboxing typically occur when you store or retrieve a value type. However, a List can provide performance similar to an array of the same type if no reallocations are required; that is, if the initial capacity is a good approximation of the maximum size of the list.
Most situations that call for an array can use an ArrayList or a List instead; they are easier to use and, in general, have performance similar to an array of the same type.
Array is in the System namespace; ArrayList is in the System.Collections namespace; List is in the System.Collections.Generic namespace.