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

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

Вы спрашиваете конкретно о 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

Из ссылки:

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

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

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

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

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

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

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

4.Combinations

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

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

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

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

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

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

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

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

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

  • Почему Java Collection не удаляет общие методы?
  • Уведомлять ObservableCollection при изменении позиции
  • ArrayList vs. Vectors в Java, если безопасность streamов не является проблемой
  • Фильтрация коллекций в C #
  • Поиск всех объектов, имеющих заданное свойство внутри коллекции
  • Какой тип использует Java Collections.sort (узлы)?
  • Lambda выражение для преобразования массива / Список строк в массив / Список целых чисел
  • Привязка списка в @RequestParam
  • Печать HashMap в Java
  • Должен ли я возвращать коллекцию или stream?
  • Разница между Arrays.asList (массив) и новым ArrayList (Arrays.asList (массив))
  • Interesting Posts

    Как переименовать основной тег заголовка в mp3-файлах ID3

    Предпочтения Google Chrome Sync

    c # linq orderby numbers, которые являются строками (и вы не можете преобразовать их в int)

    Массовая загрузка изображений с организацией

    Windows 10 «Некоторые настройки управляются вашей организацией» (gpedit.msc не работает)

    Сильный воинский маршрут не маршрутизирует правильно

    Стилизация определенного набора типов ввода в многоразовом режиме с помощью Sass

    Как заставить Windows 7 запрашивать «свежий» IP-адрес с сервера DHCP?

    Как добавить «Открыть с помощью Notepad ++» (Portable) в контекстное меню Windows?

    Инициализация ленивого поля с помощью lambda

    WinForms DataGridView – привязка к объекту со свойством списка (переменное число столбцов)

    Почему меньше, когда у вас может быть больше? (Пейджеры на * Nix)

    Как проецировать чистую в андроид-студию?

    Как сказать Windows 7 игнорировать шлюз по умолчанию

    jQuery: выбор всех элементов, где атрибут больше значения

    Давайте будем гением компьютера.