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

Разница между HashMap и ArrayList в Java?

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

4b9b3361

Ответ 1

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

Список:

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

Карта

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

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

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

Ответ 2

Если вы используете ArrayList, вам нужно получить доступ к элементам с индексом (int type). С помощью 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 вы можете использовать любой тип ключа, который вы хотите.

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

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.

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

Ответ 3

Не совсем конкретный вопрос Java. Кажется, вам нужен "праймер" в структурах данных. Попробуйте googling "Какую структуру данных вы должны использовать"

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

Из ссылки:

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

  • Когда использовать Hashtable?

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

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

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

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

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

4.Combinations

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

  1. Установить классы

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

  // ...
  List list = new ArrayList();
  list.add(

Ответ 4

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

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

Ответ 5

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

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

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