В чем разница между массивом, ArrayList и списком?

Мне интересно, какая именно разница между Array, ArrayList и List (так как все они имеют подобные понятия) и где вы будете использовать один над другим.

Пример:

массив
Для массива мы можем добавлять только те типы, которые мы объявляем для этого примера int.

int[] Array = new Int[5]; //Instansiation of an array
for(int i = 0; i < Array.Length; i++)
{
   Array[i] = i + 5; //Add values to each array index
}

ArrayList
Мы можем добавлять значения так же, как массив

ArrayList arrayList = new ArrayList();
arrayList.Add(6);
arrayList.Add(8);

Список
Снова мы можем добавить такие значения, как в массиве

List<int> list = new List<int>();
list.Add(6);
List.Add(8);

Я знаю, что в списке вы можете иметь общий тип поэтому вы можете передать любой тип, который нельзя сделать в массиве, но мои точные вопросы:

  • Где бы вы использовали один над другим?
  • Точная разница в функциональности между тремя?

Ответы

Ответ 1

Это разные типы объектов. Они имеют разные возможности и хранят свои данные по-разному. Вы также можете спросить, в чем разница между десятичной точкой и DateTime.

Массив (System.Array) фиксируется по размеру после его выделения. Вы не можете добавлять к нему элементы или удалять элементы из него. Кроме того, все элементы должны быть одного типа. В результате он безопасен по типу и также является наиболее эффективным из трех, как с точки зрения памяти, так и производительности. Кроме того, System.Array поддерживает несколько измерений (т.е. Имеет свойство Rank), в то время как List и ArrayList не работают (хотя вы можете создать список списков или ArrayList из ArrayLists, если хотите).

ArrayList - это гибкий массив, содержащий список объектов. Вы можете добавлять и удалять элементы из него, и он автоматически занимается распределением пространства. Если вы сохраняете в нем типы значений, они помещаются в коробку и распаковываются, что может быть немного неэффективным. Кроме того, он не является безопасным для типа.

List<> использует дженерики; это, по сути, версия ArrayList, безопасная для типов. Это означает, что нет бокса или unboxing (что повышает производительность), и если вы попытаетесь добавить элемент неправильного типа, он будет генерировать ошибку времени компиляции.