Java - Карты и Хеш-Карты - PullRequest
       29

Java - Карты и Хеш-Карты

2 голосов
/ 15 февраля 2012

Так что это очень очень простой вопрос. Хотя я читал класс, написанный коллегой, и я занимался Java только около шести месяцев, и я перебираю:

private Map<Dimension, Object> data = new HashMap<Dimension, Object>();

Конечно, я консультировался в Интернете, но на самом деле это не давало объяснения, которое я мог бы понять слишком хорошо. Поэтому мне интересно, может ли кто-нибудь объяснить, что делает этот код и что обычно делают Карты? Что такое карта или HashMap (и почему при объявлении карты они создают HashMap?). Кроме того, для чего используются Карты и что делает их лучше, чем, скажем, ArrayList?

Ответы [ 4 ]

5 голосов
/ 15 февраля 2012

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

Имея это в виду, прочитайте эти два документа

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

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

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

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

3 голосов
/ 15 февраля 2012

С Учебник Oracle Map Interface :

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

Таким образом, содержимое карты в вашем коде может быть:

DimensionX => x-dimension stuff
DimensionY => y-dimension stuff
DimensionZ => z-dimension stuff

Что касается разницы между картами и массивами:

Карты хранят пары ключ / значение и предоставляют средства доступа, например, к значению, данному ключу.

Map<Dimension, Object> myDimensionMap = new HashMap<Dimension, Object>();
Dimension dimensionXKey = new Dimension("X");
Object dimensionXValue = myDimensionMap[dimensionXKey];

ArrayList (и списки в целом) обеспечивают упорядоченное хранение значений.

List<String> myTokenList = Arrays.asList(new String[]{"first", "second", "third"});
String firstToken = myTokenList.get(0); // "first"

Карты отлично подходят для кеширования, где вам нужно искать что-то на основе ключа;обычно они не упорядочены, но LinkedHashMap сохраняет порядок вставки в виде списка.

Объявление Map в вашем примере кода довольно распространено, и оно демонстрирует практику объявления переменных Collections в качестветип интерфейса и значение как реализация этого интерфейса.Как уже отмечали другие, интерфейс (например, Map) определяет методы, доступные пользователям, тогда как реализация (например, HashMap) реализует логику для поддержки интерфейса.

Это считается хорошей практикой, поскольку позволяет изменять базовую реализацию (в данном случае) Map без изменения кода, который ее использует.

2 голосов
/ 15 февраля 2012

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

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

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

Я предлагаю вам прочитать документы для Интерфейс карты и Реализация HashMap , а также концепцию Hash Table в Википедии .

1 голос
/ 15 февраля 2012

Отличие от ArrayLists состоит в том, что Карты хранят ключ-> значение ассоциации , в то время как хранилище ArrayList индексируется.

Ваш коллега может назначить HashMap для карты с типом переменной, потому что HashMap реализует интерфейс Map (http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html).

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

...