Инфраструктура коллекций Java предоставляет набор классов коллекций. У каждого класса есть свои сильные и слабые стороны. Некоторые из классов предоставляют полные реализации, которые можно использовать как есть. Другие являются абстрактными, которые предоставляют скелетные реализации, которые используются в качестве отправных точек для создания коллекций. Реализации коллекции используют каркас синхронизированной оболочки для обеспечения синхронизированных классов, в противном случае реализации несинхронизированы. Несколько классов предоставляют реализации интерфейса карты.
Платформа Java содержит три реализации Map общего назначения: HashMap, TreeMap и LinkedHashMap. HashMap и Hashtable - это две коллекции в Java, используемые для хранения пар ключ / значение в хеш-таблице. Hashtable - это синхронизированная карта, а HashMap - несинхронизированная карта. Тем не менее, если вам нужно использовать синхронизированную карту, Hashtable работает быстрее, чем использование HashMap в синхронизированной оболочке. Оба являются основанными на хэше коллекциями в Java, но они имеют свою долю различий. Мы выделим некоторые ключевые различия между ними, чтобы помочь вам лучше понять термины.
HashMap - это реализация Map, основанная на хеш-таблице, которая обеспечивает постоянную производительность для вставки и размещения пар. Класс HashMap предоставляет реализацию карты, основанную на структуре данных Hashtable. Эта реализация поддерживает все операции Map и допускает несколько нулевых значений, но только один нулевой ключ. Он использует пары ключ / значение для хранения значений в хеш-таблице. Это несинхронизированная карта, которая означает, что она не поточнобезопасна и не может быть разделена между несколькими потоками без надлежащей синхронизации.
В отличие от HashMap, Hashtable является синхронизированной картой и является поточно-ориентированной, что означает, что она может быть разделена между несколькими потоками. В Hashtable вы указываете объект, который можно использовать в качестве ключа, и значение, которое соответствует ключу. Hashtable отображает ключи на значения с помощью хэш-функции. Java предоставляет эту функцию в форме метода Object hashcode (), который классы переопределяют для предоставления соответствующих хэш-кодов. В отличие от HashMap, Hashtable не поддерживает нулевые значения и нулевые ключи, потому что в реализации метода put Hashtable есть проверка нуля.
Оба - основанные на хэше коллекции в Java, используемые для хранения данных в парах ключ / значение. HashMap - это реализация Map, основанная на хеш-таблице, которая обеспечивает постоянную производительность для вставки и размещения пар. Производительность можно регулировать с помощью конструкторов, которые позволяют установить емкость и коэффициент загрузки хеш-таблицы. Базовый Hashtable очень похож на HashMap, даже по именам методов. Он хранит пару ключ / значение в хэш-таблице. В Hashtable вы указываете объект, который можно использовать в качестве ключа, и значение, которое соответствует ключу..
И HashMap, и Hashtable используют методы хеширования для хранения значений на основе ключа. Как и HashMap, Hashtable использует пары ключ / значение для хранения значений в хеш-таблице. Однако ключевое различие между ними заключается в синхронизации. HashMap - это несинхронизированная карта, тогда как Hashtable - это синхронизированная карта. Это означает, что HashMap не является поточно-ориентированным и не может использоваться несколькими потоками без надлежащего кода синхронизации. Напротив, Hashtable является поточно-ориентированным и может использоваться несколькими потоками. Hashtable быстрее, чем использование HashMap в синхронизированной оболочке, если вам нужно использовать синхронизированную карту.
Класс HashMap предоставляет реализацию карты, основанную на структуре данных Hashtable. Эта реализация поддерживает все операции Map и допускает множественные нулевые значения, но только один нулевой ключ, чтобы он мог поддерживать уникальные свойства ключа. Тем не менее, он не дает никаких гарантий относительно порядка, в котором хранятся записи. С другой стороны, Hashtable отображает ключи на значения с помощью хэш-функции. В отличие от HashMap, Hashtable не поддерживает нулевые значения и нулевые ключи, потому что в реализации метода put Hashtable есть проверка нуля.
Поскольку HashMap не является синхронизированной картой, он намного быстрее и лучше, чем Hashtable, с точки зрения производительности и фактически использует меньше памяти, чем Hashtable. Хотя они практически идентичны, Hashtable немного медленнее, чем HashMap, но быстрее, чем синхронизированный HashMap. По своей сути, использование Hashtable с многопоточным доступом небезопасно, поскольку синхронизируются только методы. Hashtable - это синхронизированный аналог HashMap. Несинхронизированные объекты работают лучше по сравнению с синхронизированными объектами, так же как Hashtable работает лучше в однопоточной среде.
Класс HashMap дает вам несортированную, неупорядоченную карту. Поэтому, когда вам нужна карта, и вас не волнует порядок, в котором хранятся записи, тогда HashMap - это путь.
Hashtable, как и Vector, был с доисторических времен Java. Так же, как Vector является синхронизированным аналогом более современного и усовершенствованного ArrayList, Hashtable является синхронизированным аналогом HashMap. Тем не менее, класс не может быть синхронизирован, поэтому, когда мы говорим, что Hashtable является синхронизированной картой, это означает, что ключевые методы класса синхронизированы.
Хотя оба они практически идентичны, разница заключается в том, как они синхронизируются и как они работают. HashMap работает лучше в многопоточной среде, тогда как Hashtable работает лучше в однопоточной среде.