Различие между HashMap и ArrayList в Java?

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

43
задан Tot Zam 17 August 2017 в 05:36
поделиться

4 ответа

Вы спрашиваете конкретно об ArrayList и HashMap, но я думаю, чтобы полностью понять, что происходит, вам нужно понять фреймворк Collections. Итак, ArrayList реализует интерфейс List, а HashMap реализует интерфейс Map. Поэтому главный вопрос заключается в том, когда вы хотите использовать список, а когда - карту. Здесь очень помогает документация Java API.

Список:

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

Карта:

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

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

Map, с другой стороны, берет один объект и использует его как ключ (индекс) к другому объекту (значению). Допустим, у вас есть объекты, которые имеют уникальные идентификаторы, и вы знаете, что в какой-то момент захотите получить доступ к этим объектам по идентификатору, карта облегчит вам эту задачу (и сделает ее быстрее/эффективнее). Реализация HashMap использует хэш-значение ключевого объекта для определения места его хранения, поэтому порядок следования значений не гарантируется. Однако в Java API есть другие классы, которые могут это обеспечить, например, LinkedHashMap, который не только использует хэш-таблицу для хранения пар ключ/значение, но и ведет список (LinkedList) ключей в порядке их добавления, так что вы всегда можете получить доступ к элементам в порядке их добавления (при необходимости).

79
ответ дан 26 November 2019 в 22:34
поделиться

Не совсем конкретный вопрос по Java. Похоже, вам нужен "букварь" по структурам данных. Попробуйте погуглить "What data structure should you use"

Попробуйте эту ссылку http://www.devx.com/tips/Tip/14639

Из ссылки :

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

  1. Когда использовать хэш-таблицу?

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

  1. Когда использовать список или вектор?

Это хороший вариант, когда вы хотите получить последовательный или даже случайный доступ. Кроме того, если размер данных изначально неизвестен и/или будет динамически увеличиваться, целесообразно использовать список или вектор. Например, для хранения результатов JDBC ResultSet можно использовать java.util.LinkedList. Если же вам нужен изменяемый по размеру массив, используйте класс java.util.ArrayList.

  1. Когда использовать массивы?

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

4.Комбинации

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

  1. Классы множеств

Начиная с JDK 1.2, у вас также есть классы множеств, такие как java.util.TreeSet, которые полезны для сортировки множеств, не содержащих дубликатов. Одна из лучших вещей в этих классах - они все подчиняются определенному интерфейсу, так что вам не нужно беспокоиться о специфике. Например, посмотрите на следующий код.

  // ...
  List list = new ArrayList();
  list.add(
14
ответ дан 26 November 2019 в 22:34
поделиться

Если вы используете ArrayList , вам нужно получить доступ к элементам с индексом (тип int ). С помощью HashMap вы можете получить к ним доступ по индексу другого типа (например, String )

HashMap<String, Book> books = new HashMap<String, Book>();
// String is the type of the index (the key)
// and Book is the type of the elements (the values)
// Like with an arraylist: ArrayList<Book> 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 вы можете использовать любой тип ключа, какой захотите.

Еще один полезный пример - игра: у вас есть набор изображений, и вы хотите их перевернуть. Итак, вы пишете метод переворота изображения, а затем сохраняете перевернутые результаты:

HashMap<BufferedImage, BufferedImage> flipped = new HashMap<BufferedImage, BufferedImage>();
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 .

Надеюсь, вы понимаете мой второй пример.

16
ответ дан 26 November 2019 в 22:34
поделиться

Используйте список для упорядоченного набора только значений . Например, у вас может быть список файлов для обработки.

Используйте карту для (обычно неупорядоченного) отображения от ключа к значению. Например, у вас может быть карта от идентификатора пользователя к сведениям об этом пользователе, чтобы вы могли эффективно находить сведения с указанием только идентификатора. (Вы могли бы реализовать интерфейс Map , просто сохранив список ключей и список значений, но обычно будет более эффективная реализация - HashMap использует внутреннюю хеш-таблицу, например, для поиска амортизированного ключа O (1).)

4
ответ дан 26 November 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: