Общий список (List<T>
) всегда должен быть быстрее, чем ArrayList.
Во-первых, ArrayList
не является строго типизированным и принимает типы object
, поэтому, если вы храните типы значений в ArrayList
, они будут в штучной упаковке и распакованы каждый раз, когда они добавляются или доступны.
Общий список может быть определен так, чтобы принимать только (скажем) int
, поэтому при добавлении / доступе к элементам списка не нужно выполнять упаковку или распаковку.
Если вы имеете дело с ссылочными типами, вам, вероятно, все-таки лучше использовать универсальный список вместо ArrayList, поскольку, хотя в нем нет никаких операций по упаковке / распаковке, ваш общий список является безопасным для типов и не будет неявные (или явные) приведения, необходимые при извлечении вашего строго типизированного объекта из «коллекции» ArrayList типов object
.
Могут быть некоторые крайние случаи, когда ArrayList работает быстрее, чем Generic List, однако я (лично) еще не сталкивался с ним. Даже документация MSDN гласит:
Вопросы производительности
При принятии решения использовать ли
List <(Of <(T>)>) или класс ArrayList,
оба из которых имеют похожие
функциональность, помните, что
Класс List <(Of <(T>)>) работает лучше
в большинстве случаев и является безопасным типом. Если
ссылочный тип используется для типа T из
список <(Of <(T>)>),
Поведение двух классов
идентичны. Однако, если тип значения
используется для типа T, вам необходимо учитывать
вопросы реализации и бокса.
Если тип значения используется для типа T,
компилятор генерирует
реализация списка <(Of <(T>)>)
класс специально для этого значения
тип. Это означает, что элемент списка
Объект List <(Of <(T>)>) не имеет
быть в штучной упаковке, прежде чем элемент может быть
используется, и после примерно 500 списка
элементы созданы память сохранена
не элементы списка бокса больше
чем память, используемая для генерации
реализация класса.
Убедитесь, что тип значения используется для
Тип T реализует IEquatable <(Of
<(T>)>) универсальный интерфейс. Если не,
методы типа Contains должны вызывать
Object .. ::. Equals (Object) метод,
какие блоки затрагивает элемент списка.
Если тип значения реализует
IComparable интерфейс, и вы владеете
исходный код, также реализовать
IComparable <(Of <(T>)>) универсальный
интерфейс для предотвращения BinarySearch
и сортировать методы из боксерского списка
элементы. Если вы не являетесь владельцем источника
код, передайте IComparer <(Of <(T>)>)
объект BinarySearch и сортировка
методы
Более того, мне особенно нравится самый последний раздел этого абзаца, в котором говорится:
В ваших интересах использовать реализацию класса List <(Of <(T>)>) для конкретного типа вместо использования класса ArrayList или написания строго типизированной коллекции-оболочки самостоятельно. Причина в том, что ваша реализация должна делать то, что уже делает для вас .NET Framework, и общеязыковая среда выполнения может совместно использовать код и метаданные промежуточного языка Microsoft, чего ваша реализация не может.
Туш! :)