В 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 освободит память, используемую этим объектом, и выделит другую.
Первое, что пришло на ум:
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
, который может быть полезным также.
На самом деле я думаю , MSDN помогает предоставить довольно хорошие ответы на все эти вопросы. Просто ищите наборы.NET.
Существуют тонкие и not-so-subtle различия между универсальными и неуниверсальными наборами. Они просто используют различные базовые структуры данных. Например, Хеш-таблица гарантирует one-writer-many-readers без синхронизации. Словарь не делает.
Хеш-таблицы/Словари являются O (1) производительность, означая, что производительность не является функцией размера. Это важно для знания.
РЕДАКТИРОВАНИЕ: На практике, средняя временная сложность для Hashtable/Dictionary<> поиски O (1).
Они разъяснены вполне прилично в intellisense. Просто Система типа . Наборы. или Система. Наборы. Дженерики (предпочтенный) и Вы получите список и краткое описание того, что доступно.
Универсальные наборы будут работать лучше, чем их неуниверсальные дубликаты, особенно при итерации через многие объекты. Это вызвано тем, что упаковка и распаковывание больше не происходят.
Вот несколько общих советов для Вас:
можно использовать foreach
на типах та реализация IEnumerable
. IList
по существу IEnumberable
с Count
и Item
(доступ к объектам с помощью основанного на нуле индекса) свойства. IDictionary
, с другой стороны, средства можно получить доступ к объектам любым-hashable индексом.
Array
, ArrayList
и List
вся реализация IList
. Dictionary
, SortedDictionary
, и Hashtable
реализация IDictionary
.
при использовании.NET 2.0 или выше рекомендуется использовать универсальные дубликаты упомянутых типов.
Для сложности времени и пространства различных операций на этих типах, необходимо консультироваться с их документацией.
структуры данных.NET находятся в [1 115] пространство имен. Существуют библиотеки типов такой как [1 116] PowerCollections, которые предлагают дополнительные структуры данных.
Для получения полного понимания структур данных консультируйтесь с ресурсами такой, поскольку СБРАСЫВАЕТ .
Во-первых, все наборы в.NET реализуют IEnumerable.
113-секундный, много наборов является дубликатами, потому что дженерики были добавлены в версии 2.0 платформы.
Так, хотя универсальные наборы, вероятно, добавляют опции по большей части:
, Массивы являются набором фиксированного размера, что можно изменить значение, сохраненное в данном индексе.
SortedDictionary является IDictionary, который отсортирован на основе ключей. SortedList является IDictionary, который отсортирован на основе необходимого IComparer.
Так, реализации IDictionary (те, которые поддерживают KeyValuePairs): * Хеш-таблицей * Словарь * SortedList * SortedDictionary
Другой набор, который был добавлен в.NET 3.5, является Hashset. Это - набор, который поддерживает операции присвоения.
кроме того, LinkedList является стандартной реализацией связанного списка (Список является списком массива для более быстрого извлечения).
, Если вообще возможный, используйте дженерики. Это включает: