ArrayList vs List <> в C # - PullRequest
       72

ArrayList vs List <> в C #

366 голосов
/ 22 февраля 2010

В чем разница между ArrayList и List<> в C #?

Только у List<> есть тип, а у ArrayList нет?

Ответы [ 11 ]

483 голосов
/ 22 февраля 2010

Да, в значительной степени. List<T> - универсальный класс. Он поддерживает сохранение значений определенного типа без приведения к или из object (что повлекло бы за собой накладные расходы на упаковку / распаковку, когда T является типом значения в случае ArrayList). ArrayList просто хранит object ссылок. Как общая коллекция, List<T> реализует общий интерфейс IEnumerable<T> и может легко использоваться в LINQ (без необходимости вызова Cast или OfType).

ArrayList относится к тем дням, когда в C # не было дженериков. Это устарело в пользу List<T>. Вы не должны использовать ArrayList в новом коде, предназначенном для .NET> = 2.0, если вам не нужно взаимодействовать со старым API, который его использует.

94 голосов
/ 22 октября 2012

Используя List<T>, вы можете предотвратить ошибки приведения. Очень полезно избегать времени выполнения ошибки приведения.

Пример:

Здесь (используя ArrayList) вы можете скомпилировать этот код, но позже вы увидите ошибку выполнения.

ArrayList array1 = new ArrayList();
array1.Add(1);
array1.Add("Pony"); //No error at compile process
int total = 0;
foreach (int num in array1)
{
 total += num; //-->Runtime Error
}

Если вы используете List, вы избежите этих ошибок:

List<int> list1 = new List<int>();
list1.Add(1);
//list1.Add("Pony"); //<-- Error at compile process
int total = 0;
foreach (int num in list1 )
{
 total += num;
}

Справка: 1017 * MSDN *

23 голосов
/ 24 октября 2013

Для добавления к вышеуказанным пунктам. Использование ArrayList в 64-битной операционной системе занимает в 2 раза больше памяти, чем использование в 32-битной операционной системе. Между тем, общий список List<T> будет использовать гораздо меньше памяти, чем ArrayList.

Например,

, если мы используем ArrayList из 19 МБ в 32-разрядной версии, для 64-разрядной системы потребуется 39 МБ. Но если у вас есть общий список List<int> по 8 МБ в 32-битной версии, то для 64-битной версии потребуется всего 8,1 МБ, что составляет колоссальную разницу в 481% по сравнению с ArrayList.

Источник: Список ArrayList и универсальный список для примитивных типов и 64-битных

18 голосов
/ 12 ноября 2015

Еще одно отличие, которое нужно добавить, касается синхронизации потоков.

ArrayList обеспечивает некоторую поточную безопасность через свойство Synchronized, которое возвращает поточно-ориентированную оболочку вокруг коллекции. Оболочка работает, блокируя всю коллекцию при каждой операции добавления или удаления. Поэтому каждый поток, который пытается получить доступ к коллекции, должен ждать своей очереди, чтобы взять одну блокировку. Это не масштабируется и может привести к значительному снижению производительности для больших коллекций.

List<T> не обеспечивает никакой синхронизации потоков; Код пользователя должен обеспечивать всю синхронизацию при одновременном добавлении или удалении элементов в нескольких потоках.

Подробнее здесь Синхронизация потоков в .Net Framework

6 голосов
/ 07 июня 2018

Простой ответ:

ArrayList не является универсальным

  • Это тип объекта, поэтому вы можете хранить в нем любой тип данных.
  • Вы можете хранить любые значения (тип значения или ссылочный тип), такие как строка, int, employee и object, в ArrayList. (Примечание а)
  • Бокс и распаковка произойдут.
  • Не тип безопасного.
  • Это старше.

Общий список

  • Это тип типа, так что вы можете указать T во время выполнения.
  • Вы можете сохранить единственное значение типа T (строка или int, сотрудник или объект) на основе объявления. (Примечание или)
  • Бокса и распаковки не произойдет.
  • Тип сейфа.
  • Это новее.
* * +1034 Пример: * * тысяча тридцать пять
ArrayList arrayList = new ArrayList();
List<int> list = new List<int>();

arrayList.Add(1);
arrayList.Add("String");
arrayList.Add(new object());


list.Add(1);
list.Add("String");                 // Compile-time Error
list.Add(new object());             // Compile-time Error

Пожалуйста, прочтите официальный документ Microsoft : https://blogs.msdn.microsoft.com/kcwalina/2005/09/23/system-collections-vs-system-collection-generic-and-system-collections-objectmodel/

enter image description here

Примечание : Вы должны знать обобщения, прежде чем понимать разницу: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/

3 голосов
/ 27 апреля 2016

ArrayList не являются типобезопасными, тогда как List<T> являются типобезопасными. Просто:).

3 голосов
/ 02 июля 2012

ArrayList - это наборы данных различных типов, тогда как List<> - это набор аналогичных типов его собственных зависимостей.

1 голос
/ 18 апреля 2018

Я думаю, различия между ArrayList и List<T>:

  1. List<T>, где T - тип значения быстрее, чем ArrayList. Это потому что List<T> избегает упаковки / распаковки (где T - тип значения).
  2. Многие источники говорят - обычно ArrayList используется только для обратного совместимость. (это не реальная разница, но я думаю, что это важное примечание).
  3. Отражение легче с неэнергичным ArrayList, чем List<T>
  4. ArrayList имеет IsSynchronized свойство. Так легко создать и использовать синхронизированный ArrayList. Я не нашел IsSynchronized свойства для List<T>. Также имейте в виду, что этот тип синхронизации относительно неэффективен, msdn ):

    var arraylist = new ArrayList();
    var arrayListSyncronized = ArrayList.Synchronized(arraylist
    Console.WriteLine($"syncronized {arraylist.IsSynchronized}");
    Console.WriteLine($"syncronized {arrayListSyncronized.IsSynchronized}");
    
    var list = new List<object>();
    var listSyncronized = ArrayList.Synchronized(list);
    Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
    Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
    
  5. ArrayList имеет свойство ArrayList.SyncRoot, которое можно использовать для синхронизации ( msdn ). List<T> не имеет SyncRoot свойства, поэтому в Следующая конструкция вам нужно использовать какой-то объект, если вы используете List<T>:

    ArrayList myCollection = new ArrayList();
    lock(myCollection.SyncRoot) //  ofcourse you can use another object for this goal
    {
        foreach (object item in myCollection)
        {
            // ...
        }
    }
    
0 голосов
/ 28 сентября 2015

Используя «Список», вы можете предотвратить ошибки приведения. Очень полезно избегать ошибки приведения во время выполнения.

Пример:

Здесь (используя ArrayList) вы можете скомпилировать этот код, но позже вы увидите ошибку выполнения.

    // Create a new ArrayList


    System.Collections.ArrayList mixedList = new System.Collections.ArrayList();


    // Add some numbers to the list
    mixedList.Add(7);
    mixedList.Add(21);


    // Add some strings to the list
    mixedList.Add("Hello");
    mixedList.Add("This is going to be a problem");




    System.Collections.ArrayList intList = new System.Collections.ArrayList();
    System.Collections.ArrayList strList = new System.Collections.ArrayList();


    foreach (object obj in mixedList)
    {
        if (obj.GetType().Equals(typeof(int)))
        {
            intList.Add(obj);
        }
        else if (obj.GetType().Equals(typeof(string)))
        {
            strList.Add(obj);
        }
        else
        {
            // error.
        }
    }
0 голосов
/ 23 июля 2015

Для меня это все о знании ваших данных. Если я продолжу расширять свой код на основе эффективности, мне придется выбрать опцию «Список» как способ расшифровки моих данных без ненужного шага, который всегда интересует типы, особенно «Пользовательские типы». Если машина понимает разницу и может определить, с каким типом данных я на самом деле имею дело, тогда почему я должен мешать и тратить время на размышления «ЕСЛИ ТАК ЕЩЕ»? Моя философия - позволить машине работать вместо меня, а я работаю над ней? Знание уникальных различий различных команд объектного кода имеет большое значение для повышения эффективности вашего кода.

Том Джонсон (Один вход ... один выход)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...