Разница между связанными HashMap, HashMap, Map, Hashtable - PullRequest
2 голосов
/ 17 июня 2011

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

Мне не удалось выяснить разницу между связанными хеш-картой, картой, хэш-таблицей и хэш-картой, присутствующими в API Java Collection.,

Все ли они имеют одинаковые сложности "получить и поставить"?Я знаю, что map - это интерфейсный класс, и hashmap, hashtable, connectedhashmap реализуют этот интерфейс.Значит ли это, что внутренняя реализация этих трех классов одинакова?Как они реализованы в коллекциях API?

Заранее спасибо !!!

Ответы [ 3 ]

13 голосов
/ 17 июня 2011

Я сомневаюсь, что различия можно объяснить значительно лучше, чем то, что уже написано в JavaDocs для этих классов:

  • Карта является базовым интерфейсом, общим для всех этих классов
  • a Hashtable является одной из реализаций этого интерфейса, для "старых" дней, когда считалось, что синхронизировать все - хорошая идея (ссылка Vector ). Он предлагает «вид» поточной безопасности, если вы знаете, что делаете. Если вы серьезно относитесь к карте, которую можно использовать из нескольких потоков, вы должны обязательно проверить ConcurrentHashMap и ConcurrentSkipListMap.
  • a HashMap - почти то же самое, что и Hashtable, но с удаленной синхронизацией. Это предпочтительная реализация карты общего назначения.
  • a LinkedHashMap дополнительно поддерживает связанный список своих записей, что позволяет легко упорядочивать или использовать его в качестве кэша LRU, просто прочитайте JavaDoc.

Все вышеупомянутые Map реализации имеют свои основные операции получения / размещения в (амортизированных) O (1) временных сложностях. Существуют небольшие различия в обработке значений null, для получения подробностей неизбежно следует проверять JavaDoc.

Чтобы понять, как реализованы эти классы, взгляните на их дерево наследования:

  • Map (только интерфейс)
    • Dictionary (устаревший абстрактный класс)
      • Hashtable («старая» реализация карты живет сама по себе)
    • AbstractMap (базовый функционал "новой" реализации карт)
      • HashMap (первая конкретная реализация карты для общего назначения)
        • LinkedHashMap (расширяет HashMap путем сохранения связанного списка)
7 голосов
/ 17 июня 2011

Все они соблюдают один и тот же контракт, но есть некоторые различия в реализации:

  • LinkedHashMap: ключи хранятся в порядке вставки
  • HashTable: все операции синхронизированы, без упорядочивания.
  • HashMap: нет гарантий заказа, лучшая производительность

Как правило, рекомендуется использовать Map в качестве типа для переменных, а затем создавать экземпляр реализующего типа в зависимости от потребностей вашего кода. HashMap обычно предпочтительнее, если вам не нужны некоторые гарантии заказа, в этом случае LinkedHashMap или TreeMap являются хорошим выбором.

0 голосов
/ 30 января 2015

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

HashMap не дает абсолютно никаких гарантий относительно порядка итераций. Он может (и будет) даже полностью меняться при добавлении новых элементов. TreeMap будет выполнять итерацию в соответствии с «естественным упорядочением» ключей в соответствии с их методом compareTo () (или внешним компаратором). Кроме того, он реализует интерфейс SortedMap, который содержит методы, которые зависят от этого порядка сортировки. LinkedHashMap будет выполнять итерацию в порядке, в котором записи были помещены в карту «Hashtable» - это общее название для карт на основе хеша. В контексте Java API Hashtable является устаревшим классом со времен Java 1.1 до существования инфраструктуры коллекций. Его больше не следует использовать, поскольку его API перегружен устаревшими методами, дублирующими функциональность, а его методы синхронизированы (что может снизить производительность и, как правило, бесполезно). Используйте ConcurrrentHashMap вместо Hashtable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...