Структуры данных.NET: ArrayList, Список, HashTable, Словарь, SortedList, SortedDictionary — Скорость, память, и когда использовать каждого?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

209
задан Peter Mortensen 18 May 2015 в 04:57
поделиться

9 ответов

Первое, что пришло на ум:

  • Array * - представляет олдскульную матрицу элементов памяти - отчасти как псевдоним для нормального type[] массив. Может перечислить. Не может вырасти автоматически. Я принял бы, очень быстро вставляют и retrival скорость.

  • ArrayList - автоматически выращивающий массив. Добавляет больше служебное. Может перечисление., вероятно, медленнее, чем нормальный массив, но все еще довольно быстро. Они используются много в.NET

  • List - один из моих favs - может использоваться с дженериками, таким образом, у Вас может быть массив со строгим контролем типов, например, List<string>. Кроме этого, действия очень как ArrayList

  • Hashtable - простая хеш-таблица. O (1) к O (n) худший случай. Может перечислить значение и свойства ключей, и сделать key/val пар

  • Dictionary - то же как выше только со строгим контролем типов через дженерики, такой как Dictionary<string, string>

  • SortedList - отсортированный универсальный список. Замедленный на вставке, так как это должно выяснить, куда поместить вещи. Может перечисление., вероятно, то же на извлечении, так как это не должно обращаться, но удаление, будет медленнее, чем простой список.

я склонен использовать List и Dictionary все время - как только Вы начинаете использовать их со строгим контролем типов с дженериками, его действительно твердое для возвращения к стандартным неуниверсальным.

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

149
ответ дан marc_s 23 November 2019 в 04:39
поделиться

На самом деле я думаю , MSDN помогает предоставить довольно хорошие ответы на все эти вопросы. Просто ищите наборы.NET.

1
ответ дан Peter Mortensen 23 November 2019 в 04:39
поделиться

Существуют тонкие и not-so-subtle различия между универсальными и неуниверсальными наборами. Они просто используют различные базовые структуры данных. Например, Хеш-таблица гарантирует one-writer-many-readers без синхронизации. Словарь не делает.

1
ответ дан Ilya Ryzhenkov 23 November 2019 в 04:39
поделиться

Хеш-таблицы/Словари являются O (1) производительность, означая, что производительность не является функцией размера. Это важно для знания.

РЕДАКТИРОВАНИЕ: На практике, средняя временная сложность для Hashtable/Dictionary<> поиски O (1).

3
ответ дан Chris 23 November 2019 в 04:39
поделиться

Они разъяснены вполне прилично в intellisense. Просто Система типа . Наборы. или Система. Наборы. Дженерики (предпочтенный) и Вы получите список и краткое описание того, что доступно.

3
ответ дан Joel Coehoorn 23 November 2019 в 04:39
поделиться

Универсальные наборы будут работать лучше, чем их неуниверсальные дубликаты, особенно при итерации через многие объекты. Это вызвано тем, что упаковка и распаковывание больше не происходят.

3
ответ дан Russ Cam 23 November 2019 в 04:39
поделиться

Вот несколько общих советов для Вас:

18
ответ дан blackwing 23 November 2019 в 04:39
поделиться

Во-первых, все наборы в.NET реализуют IEnumerable.

113-секундный, много наборов является дубликатами, потому что дженерики были добавлены в версии 2.0 платформы.

Так, хотя универсальные наборы, вероятно, добавляют опции по большей части:

  • Список является универсальной реализацией ArrayList.
  • Словарь является универсальной реализацией Хеш-таблицы

, Массивы являются набором фиксированного размера, что можно изменить значение, сохраненное в данном индексе.

SortedDictionary является IDictionary, который отсортирован на основе ключей. SortedList является IDictionary, который отсортирован на основе необходимого IComparer.

Так, реализации IDictionary (те, которые поддерживают KeyValuePairs): * Хеш-таблицей * Словарь * SortedList * SortedDictionary

Другой набор, который был добавлен в.NET 3.5, является Hashset. Это - набор, который поддерживает операции присвоения.

кроме того, LinkedList является стандартной реализацией связанного списка (Список является списком массива для более быстрого извлечения).

24
ответ дан Abe Heidebrecht 23 November 2019 в 04:39
поделиться

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

  • Список вместо словаря ArrayList
  • вместо HashTable
28
ответ дан Adam Tegen 23 November 2019 в 04:39
поделиться