Я часто использую ArrayList
вместо "normal" array[]
.
Мне кажется, что я обманываю (или ленив), когда я использую ArrayList
, когда можно использовать ArrayList
по массиву?
Я часто использую ArrayList
вместо "normal" array[]
.
Мне кажется, что я обманываю (или ленив), когда я использую ArrayList
, когда можно использовать ArrayList
по массиву?
Массивы строго типизированы и хорошо работают как параметры. Если вы знаете длину своей коллекции и она исправлена, вы должны использовать массив.
ArrayLists не являются строго типизированными, для каждой вставки или для Retrial требуется возврат, чтобы вернуться к исходному типу. Если вам нужен метод для получения списка определенного типа, ArrayLists не подходят, потому что вы можете передать ArrayList, содержащий любой тип. ArrayLists используют динамически расширяющийся массив внутри, поэтому есть также возможность увеличить размер внутреннего массива, когда он достигает своей емкости.
То, что вы действительно хотите использовать, - это общий список, например List<T>
. Это имеет все преимущества массивов и массивов. Он строго типизирован и поддерживает переменную длину элементов.
В дополнение к ответу Боба и Фредерика я хотел бы указать на то, что в то время как массивы имеют ковариацию, общих списков нет. Например, массив типа MyChildClass[]
можно легко отличить до MyParentClass[]
, а List<MyChildClass>
не может быть отправлен на List<MyParentClass>
, по крайней мере, не напрямую.
Если вам нужна ковариация, используйте либо массивы, либо используйте метод LINQ Cast(), либо некоторые другие средства для каждого отдельного элемента или ждать С# 4.
Еще одна мысль здесь - мутация; массив (T[]
) полностью изменен и не может быть защищен. List<T>
не предоставляет никаких полезных точек расширения, но такие вещи, как Collection<T>
(или многие другие реализации IList<T>
), позволяют вам добавлять код, например, для проверки элементов до их добавления; Аналогично, вы можете иметь только версии IList<T>
, которые полезны для безопасности потоков, где желательно неизменность.
Я обычно использую массивы либо во внутренней логике метода (возможно, в качестве локальной переменной), либо в аргументах params
, либо в нескольких высоко оптимизированных случаях, когда я знаю длину элементов, и я знаю, что код не выбирает для его изменения (как частного поля). Помимо этого, List<T>
и т.д., Как правило, более распространены, поскольку при добавлении/удалении элементов у них гораздо меньше накладных расходов.
Если эта часть кода абсолютно критична для производительности, использование ArrayList отлично.
Лучше, везде, где вы используете ArrayList
, вместо этого используйте коллекцию List<T>
. Он более строго типизирован, чем первый.
Я отвечаю на это с точки зрения Java, но это та же самая основная проблема. Вы не должны чувствовать себя виноватым, используя более высокие абстракции. В конце концов, вы используете String
вместо char[]
или даже byte[]
? Я даже предлагаю сделать еще один шаг и использовать интерфейс List
, где это возможно. Единственная причина для перехода на один шаг - это по соображениям производительности.
Использование более высокой абстракции коллекции имеет много преимуществ. Вы можете добавить декораторов, чтобы сделать Список доступным только для чтения, зафиксировать размер, проверить элементы, которые вводят или оставляют коллекцию или используют представления (см. GetRange
в С# и subList
в Java.)
Кстати, ArrayList
всегда должен основываться на примитивном массиве, иначе имя неверно. Обычно операции выполняются так, как вы ожидали бы при использовании примитивного массива. Если используется связанный список, он обычно называется именно так: LinkedList
. Это также преимущество использования интерфейса: вы можете изменить свое мнение о используемой реализации позже.
Есть несколько вещей, которые делают использование коллекций неуклюжим. Одно из предостережений состоит в том, что коллекции обычно основаны на объектах, а языки имеют значительный разрыв между примитивными и предметными типами. Ограниченные дженерики тоже не помогают. Тем не менее, я рекомендую сборники над массивами, если в этом нет веской причины.
Для примитивных значений вы также можете использовать библиотеку примитивных коллекций, например GNU Trove. Не знаю, есть ли что-то подобное для С#.
Fabulous Adventures In Coding написал фрагмент Массивы, рассмотренные несколько вреден. Это действительно интересно прочитать.
Хорошо для одного, если вы только собираетесь обрабатывать определенный тип, вы не должны использовать ArrayList. Например, если вы ожидаете только массив байтов, вы должны принимать только массив байтов.
Только время, о котором я подумал бы, может даже подумать, что использовать ArrayList вместо List.
Размер массива статический, поэтому, если вы знаете размер во время разработки, используйте массив. Предполагается, что он работает быстрее, но я сам его не тестировал. Если вам нужно часто менять количество объектов (добавление или удаление объектов из коллекции), используйте ArrayList или лучше общий список из .NET 2. Он также проще в использовании, поэтому, если производительность не имеет решающего значения, вы всегда можете использовать List.
Если вам нужен массив примитивных типов, используйте Array для лучшей производительности, так как это позволит избежать автобоксинга и распаковки. Но только если вы знаете, какой размер вы хотите раньше времени.
Это так.
using System;
using System.Collections;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
//ArrayList
/*
An ArrayList doesn't use a LinkedList as the internal data structure! .we can store any type of objects
*/
ArrayList list = new ArrayList();
list.Add("1"); // not strongly type,you can enter any object types (int,string decimals, etc..)
list.Add(1);
list.Add(1.25);
//Array
/*
must declare length.
*/
string[] array = new string[3]; // you must declare object types
array[0] = "1";
//array[1] = 1; this get error becoz array is storngly typed. // this print empty value when you run it
array[2] = "stongly typed";
Console.WriteLine("------- ARRAYLIST ITEMS ---------");
foreach (var i in list) {
Console.WriteLine(i);
}
Console.WriteLine("--------- ARRAY ITEMS -----------");
foreach (var i in array)
{
Console.WriteLine(i);
}
Console.ReadKey();
}
}
}