Разница между HashMap и ArrayList в Java?
В Java ArrayList
и HashMap
используются в качестве коллекций. Но я не мог понять, в каких ситуациях мы должны использовать ArrayList
и какие времена использовать HashMap
. В чем основное отличие между ними?
- Резервный список
- Почему Java Map не расширяет коллекцию?
- List, IList, IEnumerable, IQueryable, ICollection, который является наиболее гибким типом возврата?
- Как использовать Collections.sort () в Java? (Конкретная ситуация)
- Фильтр ArrayList
- какова хорошая постоянная структура коллекций для использования в java?
- loop on list with remove
- Как изменить список на Java?
Вы спрашиваете конкретно о ArrayList и HashMap, но я думаю, чтобы полностью понять, что происходит, вам нужно понять структуру Collections. Таким образом, ArrayList реализует интерфейс List, а HashMap реализует интерфейс Map. Поэтому реальный вопрос заключается в том, когда вы хотите использовать Список и когда вы хотите использовать карту. Здесь очень много помогает документация по API Java.
Список:
Упорядоченная коллекция (также известная как последовательность). Пользователь этого интерфейса имеет точный контроль над тем, где в списке вставлен каждый элемент. Пользователь может получить доступ к элементам по их целочисленному индексу (позиция в списке) и искать элементы в списке.
Карта:
Объект, который сопоставляет ключи значениям. Карта не может содержать дубликаты ключей; каждый ключ может отображать не более одного значения.
Так как обсуждались другие ответы, интерфейс списка (ArrayList) представляет собой упорядоченную коллекцию объектов, к которой вы обращаетесь с помощью индекса, подобно массиву (как и в случае с массивом ArrayList, это просто массив в фон, но многие детали работы с массивом обрабатываются для вас). Вы должны использовать ArrayList, когда хотите сохранить вещи в отсортированном порядке (порядок, который они добавили, или действительно позицию в списке, который вы указываете при добавлении объекта).
Карта, с другой стороны, берет один объект и использует это как ключ (индекс) к другому объекту (значение). Поэтому давайте предположим, что у вас есть объекты с уникальными идентификаторами, и вы знаете, что в какой-то момент вам захочется получить доступ к этим объектам по идентификатору, карта сделает это очень просто на вас (и быстрее / эффективнее). Реализация HashMap использует хеш-значение ключевого объекта для определения места хранения, поэтому нет никакой гарантии количества значений. Однако в Java API есть другие classы, которые могут предоставить это, например LinkedHashMap, которые, а также использование хеш-таблицы для хранения пар ключ / значение, также поддерживают список (LinkedList) ключей в том порядке, в котором они были добавлены, так что вы всегда можете получить доступ к элементам снова в том порядке, в котором они были добавлены (при необходимости).
Если вы используете ArrayList
, вам нужно получить доступ к элементам с индексом (тип int
). С помощью HashMap
вы можете получить к ним доступ по индексу другого типа (например, String
)
HashMap books = new HashMap(); // String is the type of the index (the key) // and Book is the type of the elements (the values) // Like with an arraylist: ArrayList books = ...; // Now you have to store the elements with a string key: books.put("Harry Potter III", new Book("JK Rownling", 456, "Harry Potter")); // Now you can access the elements by using a String index Book book = books.get("Harry Potter III");
Это невозможно (или намного сложнее) с ArrayList
. Единственный хороший способ доступа к элементам в ArrayList
– это получить элементы по их номеру индекса.
Таким образом, это означает, что с помощью HashMap
вы можете использовать любой тип ключа, который вы хотите.
Еще один полезный пример – игра: у вас есть набор изображений, и вы хотите перевернуть их. Итак, вы пишете метод flip-изображения, а затем сохраняете перевернутые результаты:
HashMap flipped = new HashMap(); BufferedImage player = ...; // On this image the player walks to the left. BufferedImage flippedPlayer = flip(player); // On this image the player walks to the right. flipped.put(player, flippedPlayer); // Now you can access the flipped instance by doing this: flipped.get(player);
Вы перевернули игрока один раз, а затем сохранили его. Вы можете получить доступ к BufferedImage
с BufferedImage
как ключевой тип для HashMap
.
Надеюсь, вы поймете мой второй пример.
Не совсем конкретный вопрос Java. Кажется, вам нужен «праймер» в структурах данных. Попробуйте googling «Какую структуру данных вы должны использовать»
Попробуйте эту ссылку http://www.devx.com/tips/Tip/14639
Из ссылки:
Ниже приведены некоторые советы по сопоставлению наиболее часто используемых структур данных с конкретными потребностями.
- Когда использовать Hashtable?
Хэш-таблица или аналогичные структуры данных являются хорошими кандидатами, если к хранимым данным необходимо обращаться в виде пар ключ-значение. Например, если вы выбрали имя сотрудника, результат может быть возвращен в виде хеш-таблицы в виде пары (имя, значение). Однако, если вы должны были вернуть имена нескольких сотрудников, возrotation хеш-таблицы напрямую не было бы хорошей идеей. Помните, что ключи должны быть уникальными или ваши предыдущие значения будут перезаписаны.
- Когда использовать список или вектор?
Это хороший вариант, когда вам нужен последовательный или даже произвольный доступ. Кроме того, если размер данных неизвестен изначально и / или будет расти динамически, было бы целесообразно использовать List или Vector. Например, чтобы сохранить результаты JDBC ResultSet, вы можете использовать java.util.LinkedList. Если вы ищете масштабируемый массив, используйте class java.util.ArrayList.
- Когда использовать массивы?
Никогда недооценивайте массивы. В большинстве случаев, когда мы должны использовать список объектов, мы склонны думать об использовании векторов или списков. Однако, если размер коллекции уже известен и не изменится, массив можно рассматривать как потенциальную структуру данных. Быстрее обращаться к элементам массива, чем к вектору или списку. Это очевидно, потому что все, что вам нужно, это индекс. Нет лишних дополнительных вызовов метода get.
4.Combinations
Иногда лучше всего использовать комбинацию вышеуказанных подходов. Например, вы можете использовать список хеш-таблиц в соответствии с конкретной потребностью.
- Установить classы
Начиная с JDK 1.2, у вас также есть classы, такие как java.util.TreeSet, который полезен для отсортированных наборов, у которых нет дубликатов. Одна из лучших вещей в этих classах – все они придерживаются определенного интерфейса, так что вам не нужно беспокоиться о специфике. Например, взгляните на следующий код.
// ... List list = new ArrayList(); list.add(
Используйте список для упорядоченного набора только значений. Например, у вас может быть список файлов для обработки.
Используйте карту для (обычно неупорядоченного) отображения от ключа к значению. Например, у вас может быть карта от идентификатора пользователя до деталей этого пользователя, поэтому вы можете эффективно находить детали, данные только с идентификатором. (Вы можете реализовать интерфейс Map
, просто сохранив список ключей и список значений, но, как правило, будет более эффективная реализация. Например, HashMap
использует хеш-таблицу, чтобы получить, например, отмасштабированный поиск O (1). )
Карта со списком.
На карте у вас есть пары ключ / значение. Чтобы получить доступ к значению, вам нужно знать ключ. Существует связь между ключом и значением, которое сохраняется и не является произвольным. Они как-то связаны. Пример: ДНК человека уникальна (ключ) и имя человека (значение) или лицо SSN (ключ) и имя человека (значение), существуют сильные отношения.
В списке все, что у вас есть, это значения (имя человека), и для доступа к нему вы должны знать его позицию в списке (индексе) для доступа к нему. Но между позицией значения в списке и его индексом нет постоянной связи, это произвольно.