Подтвердить что ты не робот

В чем разница между списками, ArrayLists, картами, хэшмапами, коллекциями и т.д.?

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

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

Итак, теперь я работаю с java более 3 месяцев и наткнулся на интерфейсы, которые я указал выше, и задавался вопросом, почему так много таких вещей (не говоря уже о векторах, abstractList {oh well the list is на...})?

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

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

4b9b3361

Ответ 1

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


Collection

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

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

List

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

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

Set

Коллекция, которая не содержит повторяющихся элементов. Более формально множества не содержат пары элементов 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


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

Ответ 2

Краткий обзор общих коллекций java:

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

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

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

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

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

Ответ 3

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

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

Установить - контейнер, который не позволяет дублировать

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

Установить vs List vs Map в Java

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

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

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

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

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

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