В чем разница между списками, списками массивов, картами, хэш-картами, коллекциями и т. Д.? - PullRequest
16 голосов
/ 09 ноября 2010

Я использую HashMaps с тех пор, как снова начал программировать на Java, не разбираясь в этих коллекциях.

Честно говоря, я не совсем уверен, лучше ли использовать HashMaps для меня или для производственного кода. До сих пор для меня это не имело значения, поскольку я мог получать данные, которые мне нужны, как я их называл в PHP (да, я допускаю любую негативную вещь, о которой вы думаете сейчас), где $this_is_array['this_is_a_string_index'] предоставляет так много удобство вызова массива переменных.

Итак, теперь я работаю с Java более 3 месяцев, наткнулся на интерфейсы, которые я указал выше, и удивился, почему так много всего этого (не говоря уже о векторах, abstractList ... на ...})

Я имею в виду, чем они отличаются друг от друга?

И что более важно, какой интерфейс лучше всего использовать в моем случае?

Ответы [ 7 ]

44 голосов
/ 09 ноября 2010

API довольно ясно показывает различия и / или отношения между ними:


Коллекция

Корневой интерфейс в иерархии коллекции. Коллекция представляет собой группу объектов, известных как ее элементы. Некоторые коллекции допускают дублирование элементов, а другие - нет. Некоторые заказаны, а другие не заказаны.

http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

Список

Упорядоченная коллекция (также известная как последовательность). Пользователь этого интерфейса имеет точный контроль над тем, где в списке каждый элемент вставлен. Пользователь может получить доступ к элементам по их целочисленному индексу (позиции в списке) и искать элементы в списке.

http://download.oracle.com/javase/6/docs/api/java/util/List.html

Установить

Коллекция, которая не содержит повторяющихся элементов. Более формально, множества не содержат пары элементов e1 и e2, таких как e1.equals (e2), и не более одного нулевого элемента. Как следует из его названия, этот интерфейс моделирует абстракцию математического набора.

http://download.oracle.com/javase/6/docs/api/java/util/Set.html

Карта

Объект, который сопоставляет ключи со значениями. Карта не может содержать дубликаты ключей; каждая клавиша может соответствовать максимум одному значению.

http://download.oracle.com/javase/6/docs/api/java/util/Map.html


Есть ли что-то конкретное, что вас смущает? Если это так, пожалуйста, отредактируйте исходный вопрос. Спасибо.

11 голосов
/ 09 ноября 2010

Краткое описание общих коллекций Java:

'Карта': 'Карта' - это контейнер, который позволяет хранить пару ключ => значение. Это позволяет выполнять быстрый поиск с использованием ключа, чтобы получить соответствующее значение. Есть две реализации этого в пакете java.util, 'HashMap' и 'TreeMap'. Первый реализован в виде hastable , а второй - в виде сбалансированного бинарного дерева поиска (таким образом, также имеет свойство сортировки ключей).

'Set': 'Set' - это контейнер, который содержит только уникальные элементы. Многократная вставка одного и того же значения все равно приведет к тому, что «Set» будет содержать только один его экземпляр. Он также обеспечивает быстрые операции для поиска, удаления, добавления, объединения и вычисления пересечения двух множеств. Как и «Map», он имеет две реализации: «HashSet» и «TreeSet».

«Список»: интерфейс «Список» реализуется классами «Вектор», «ArrayList» и «LinkedList». «Список» - это в основном набор элементов, которые сохраняют свой относительный порядок. Вы можете добавлять / удалять элементы и получать доступ к отдельным элементам в любой заданной позиции. В отличие от «Map», элементы «List» индексируются с помощью int, то есть их позиция - это «List» (первый элемент находится в позиции 0, а последний в «List.size ()» - 1). Vector и ArrayList реализованы с использованием массива, а LinkedList, как следует из названия, использует связанный список . Следует отметить, что, в отличие от ассоциативных массивов php (которые больше похожи на Map), массив в Java и многих других языках фактически представляет собой непрерывный блок памяти. Элементы в массиве в основном расположены рядом, так сказать, на соседних «слотах». Это дает очень быстрое время поиска и записи, намного быстрее, чем ассоциативные массивы, которые реализованы с использованием более сложных структур данных. Но они не могут быть проиндексированы ничем, кроме числовых позиций в массиве, в отличие от ассоциативных массивов.

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

Вы также можете прочитать след Java Collections , чтобы начать работу.

8 голосов
/ 09 ноября 2010

Вкратце (и только глядя на интерфейсы):

Список - список значений, что-то вроде «массива с изменяемым размером»

Set - контейнер, который не допускает дублирование

Карта - набор пар ключ / значение

2 голосов
/ 25 апреля 2012

Карта против Списка.

На карте у вас есть пары ключ / значение. Для доступа к значению вам необходимо знать ключ. Между ключом и значением существует связь, которая сохраняется и не является произвольной. Они связаны как-то. Пример: ДНК лиц уникальна (ключ) и имя человека (значение) или SSN человека (ключ) и имя человека (значение). Существует тесная связь.

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

1 голос
/ 09 ноября 2010

Как вы уже знаете, это контейнеры для объектов.Чтение их соответствующих API-интерфейсов поможет вам понять их различия.

Поскольку другие описали свои отличия в отношении их использования, я укажу вам на ссылку , которая описывает сложность различных структур данных.

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

Полезно понимать сложность различных операций для каждой из этих структур, поскольку в реальном мире, будет иметь значение, если вы постоянно будете искать объект в вашем связанном списке с 1 000 000 элементов, который не отсортирован.Производительность не будет оптимальной.

1 голос
/ 09 ноября 2010

На этот вопрос в конечном итоге очень сложный ответ - существуют целые классы колледжей, посвященные структурам данных.Короткий ответ заключается в том, что все они имеют компромиссы в использовании памяти и скорости различных операций.

Что было бы действительно здорово, так это некоторое время с хорошей книгой по структурам данных - я почти гарантирую, что вашикод значительно улучшится, если вы хорошо разберетесь в структурах данных.

Тем не менее, я могу дать вам быстрый временный совет из моего опыта работы с Java.Для большинства простых внутренних вещей, ArrayList обычно предпочтительнее.Для передачи коллекций данных обычно используются простые массивы.HashMap действительно используется только в тех случаях, когда есть логическая причина иметь специальные ключи, соответствующие значениям - я не видел, чтобы кто-нибудь использовал их в качестве общей структуры данных для всего.Другие структуры являются более сложными и, как правило, используются в особых случаях.

0 голосов
/ 05 октября 2017

Разница между множеством, списком и картой в Java - «Set», «List» и «Map» являются тремя важными интерфейсами инфраструктуры сбора Java, а «Разница между Set, List и Map в Java» является одним из наиболее часто задаваемых вопросов об интервью в Java Collection. Некоторое время этот вопрос задают как Когда использовать List, Set и Map в Java. Очевидно, что интервьюер хочет знать, знакомы ли вы с основами Java Collection Framework или нет. Чтобы решить, когда использовать Список, Набор или Карту, вам необходимо знать, что это за интерфейсы и какие функции они предоставляют. Список в Java предоставляет упорядоченную и проиндексированную коллекцию, которая может содержать дубликаты. Set предоставляет неупорядоченную коллекцию уникальных объектов, то есть Set не допускает дублирование, а Map предоставляет структуру данных, основанную на паре ключ-значение и хешировании. Все три List, Set и Map являются интерфейсами в Java, и существует множество конкретных реализаций их, доступных в Collection API. ArrayList и LinkedList являются двумя наиболее популярными реализациями List, в то время как LinkedHashSet, TreeSet и HashSet часто используются реализацией Set. В этой статье о Java мы увидим разницу между Map, Set и List в Java и узнаем, когда использовать List, Set или Map.

Set vs List vs Map в Java

Как я уже сказал, Set, List и Map являются интерфейсами, которые определяют основной контракт, например Набор контрактов говорит, что он не может содержать дубликатов. Основываясь на наших знаниях List, Set и Map, давайте сравним их по разным показателям.

Двойные объекты Основное различие между интерфейсами List и Set в Java заключается в том, что List допускает дублирование, а Set не допускает дублирование. Все реализации Set соблюдают этот контракт. Карта содержит два объекта для каждой записи, например ключ и значение, и он может содержать повторяющиеся значения, но ключи всегда уникальны. Смотрите здесь для большей разницы между List и Set структурой данных в Java.

Заказать Другое ключевое отличие между List и Set состоит в том, что List является упорядоченной коллекцией, контракт List поддерживает порядок вставки или элемент. Набор представляет собой неупорядоченную коллекцию, вы не гарантируете, какой элемент заказа будет храниться. Хотя некоторые из реализации Set, например LinkedHashSet поддерживает порядок. Также SortedSet и SortedMap, например TreeSet и TreeMap поддерживают порядок сортировки, налагаемый с помощью Comparator или Comparable.

Нулевые элементы Список допускает нулевые элементы, и вы можете иметь много нулевых объектов в списке, потому что он также допускает дублирование. Установите просто разрешить один нулевой элемент, поскольку дубликат не разрешен, в то время как в Map вы можете иметь нулевые значения и самое большее один нулевой ключ. Стоит отметить, что Hashtable не допускает нулевой ключ или значения, но HashMap допускает нулевые значения и один нулевой ключ. Это также является основным отличием этих двух популярных реализаций интерфейса Map, он же HashMap против Hashtable.

Популярная реализация

Самыми популярными реализациями интерфейса List в Java являются ArrayList, LinkedList и Vector. ArrayList является более универсальным и обеспечивает произвольный доступ с индексом, тогда как LinkedList больше подходит для частого добавления и удаления элементов из List. Вектор является синхронизированным аналогом ArrayList. С другой стороны, наиболее популярными реализациями интерфейса Set являются HashSet, LinkedHashSet и TreeSet. Во-первых, это набор общего назначения, который поддерживается HashMap. Для получения дополнительной информации посмотрите, как HashSet работает внутри Java. Он также не предоставляет никаких гарантий заказа, но LinkedHashSet обеспечивает заказ наряду с уникальностью, предоставляемой интерфейсом Set. Третья реализация TreeSet также является реализацией интерфейса SortedSet, следовательно, она хранит элементы в отсортированном порядке, указанном методами compare () или compareTo (). Теперь последняя, ​​самая популярная реализация интерфейса Map - это HashMap, LinkedHashMap, Hashtable и TreeMap. Первый - это несинхронизированная реализация Map общего назначения, в то время как Hashtable является ее синхронизированным аналогом, оба не предоставляют никаких гарантий упорядочения, которые исходят от LinkedHashMap. Как и TreeSet, TreeMap также является отсортированной структурой данных и хранит ключи в отсортированном порядке.

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