Обычно Карты делятся на две категории.

  1. Карты, не поддерживающие потокобезопасность (не синхронизированные)
  2. Потокобезопасные карты (синхронизированы)

1. Non Thread Safe против Thread Safe

Прежде чем мы разделим карты на эти две категории, сначала мы попытаемся понять, что не является потокобезопасным, а что — потокобезопасным.

1.Карты, которые могут вызвать параллельное исключение, такие карты известны как непотокобезопасные.

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

Когда возникает исключение одновременного изменения?

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

2. Одновременное изменение будет запущено не только с несколькими потоками, но и с одним потоком.

Исключение одновременного изменения в одном потоке

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

Исключение одновременной модификации в нескольких потоках

Из приведенной выше программы мы можем ясно понять, что In несколько итераций, Thread-1 повторяет объект карты, а Thread-2 модифицирует один и тот же объект карты (операция put) одновременно, поэтому мы получим следующий вывод

2. Категории Non Thread Safe и Thread Safe Map

ЧАСТЬ -1: 3. НЕРЕДОБЕЗОПАСНЫЕ КАРТЫ

(Потокобезопасные карты будут рассмотрены в следующих сообщениях)

3.1 Хэш-карта

1. Иерархия

2. Поведение Hash Map в разных категориях

3. Внутренняя реализация Hash Map:



3.2 Связанная хэш-карта

1. Иерархия

2. Поведение Linked Hash Map в разных категориях

3. Особенности Linked Hash Map

(1) Требуется больше памяти по сравнению с хеш-картой, поскольку используется DoubleLinkedList.

(2) Порядок по умолчанию, предоставляемый LinkedHashMap, — это порядок вставки ключа, известный как порядок вставки, но LinkedHashMap может быть создан с другим порядком, называемым порядком доступа, который определяется доступом к записям.

(3) Итератор LinkedHashMap возвращает элементы в порядке , например. либо порядок размещения, либо порядок доступа.

(4) Повторный ввод сопоставления не меняет порядок вставки LinkedHashMap. Например, если у вас уже есть сопоставление для ключа и вы хотите обновить его значение, вызвав put(key, newValue), порядок вставки LinkedHashMap останется прежним.

(5) На порядок доступа влияет вызов get(key), put(key, value) или putAll(). При доступе к определенной записи она перемещается в конец двусвязного списка, поддерживаемого LinkedHashMap.

(6) LinkedHashMap также предоставляет метод с именем removeEldestEntry(), который защищен, а реализация по умолчанию возвращает false. В случае переопределения реализация может вернуть значение true, чтобы удалить самую старую запись при добавлении новой записи.

4. Использование

LinkedHashMap можно использовать для создания кэша LRU в Java. Так как в LRU или кэше с наименьшим количеством недавно использованных данных удаляется самая старая незадействованная запись, которая является заголовком двусвязного списка, поддерживаемого LinkedHashMap.

5. Наблюдения

Из приведенного выше вывода мы ясно понимаем, что LinkedHashMap поддерживает порядок вставки

3.3 Идентификационная хэш-карта

1. Иерархия

2. Поведение Identity Hash Map в разных категориях

3. Возможности Identity Hash Map

(1) Основное различие между HashMap и IdentityHashMap заключается в том, что IdentityHashMap использует оператор равенства «==» для сравнения ключей и значений внутри Mapв то время как HashMap использует equals() для сравнения ключей и значений.

(2) В отличие от HashMap, который использует хэш-код для определения местоположения корзины, IdentityHashMapне использует hashCode(), вместо этого использует System.identityHashCode(object).

(3) Еще одним ключевым отличием IdentityHashMap от HashMap в Java является скорость. Поскольку IdentityHashMap не использует equals(), он сравнительно быстрее, чем HashMap для объекта с дорогими equals() и hashCode()

(4) Еще одно различие между HashMap и IdentityHashMap заключается в неизменяемости ключа. Одним из основных требований для безопасного хранения объектов в HashMap является ключи должны быть неизменяемыми. , IdentityHashMap не требует, чтобы ключи были неизменными, поскольку он не зависит от равенства и хэш-кода.

4. Использование

  • Используется для глубокого копирования
  • Объем памяти обычно меньше, чем у HashMap.

5. Наблюдения

Здесь из приведенной выше программы мы ясно замечаем разницу в выводах HashMap и Identical HashMap. Мы ясно понимаем, что IdenticalHashMap использует оператор == вместо метода equals(). Надеюсь, вы четко понимаете разницу между оператором == и методом equals().

3.4 Карта перечисления

1. Иерархия

2. Поведение Enum Map в разных категориях

3. Возможности Enum Map

(1) Специализированная реализация карты для использования с ключами типа enum.

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

(3) Карты Enum внутренне представлены в виде массивов. Это представление чрезвычайно компактно и эффективно.

(4) Итератор не выходит из строя быстро

Давайте поймем, что итератор не дает сбоев в быстром поведении на примере ниже

Из приведенного выше примера мы можем ясно понять, что, хотя карта Enum не является потокобезопасной, она не дает исключения параллельной модификации, поскольку итераторы возвращаются представлениями коллекции (keySet(), entrySet() и values()) слабо согласованы: они никогда не вызовут исключение Concurrent Modification Exception, и они могут отображать или не отображать эффекты любых изменений карты, которые происходят во время выполнения итерации.

4. Наблюдения

3.5 Слабая хэш-карта

1. Иерархия

2. Поведение Weak HashMap в разных категориях

3. Особенности слабого HashMap

  1. Каждый ключевой объект в WeakHashMap хранится косвенно как референт слабой ссылки (также называемой жесткой) ссылки.
  2. Сборщик мусора может удалить ключи в любое время, WeakHashMap может вести себя как неизвестный поток, который молча удаляет записи. Таким образом, метод size может со временем возвращать меньшие значения. Таким образом, в WeakHashMap уменьшение размера происходит автоматически.
  3. WeakHashMap не реализует интерфейс Cloneable , он реализует только интерфейс Map. Следовательно, в классе WeakHashMap нет метода clone().
  4. WeakHashMap не реализует сериализуемый интерфейс . В результате объект WeakHashMap не будет иметь ни сериализованного, ни десериализованного состояния (т. е. состояние объекта WeakHashMap не может быть сохранено и снова возобновлено из сохраненного состояния).

4. Использование

Он используется для хранения слабых ссылок в виде ключей в качестве кеша.

5. Наблюдения

Из приведенного выше примера мы ясно понимаем, что после запуска GC слабые ссылки удаляются. Различие между сильными ссылками и слабыми ссылками обсуждалось в следующих сообщениях.

3.6 Древовидная карта

1. Иерархия

2. Поведение Древовидной карты в разных категориях

3. Особенности древовидной карты

  1. Навигационная карта обеспечивает приблизительный поиск, нам нужно увидеть ближайшие ключи
  2. Итерация выполняется в естественном порядке сортировки, что является основным преимуществом.
  3. поиск нижнего и верхнего ключа
  4. Карту можно разделить на Подкарты
  5. Любой пользовательский объект должен идолжен реализовывать интерфейс Comparator, если вы указали его в качестве ключа
  6. Производительность низкаяпо сравнению с хэш-картой и связанной хэш-картой

Сортировка пользовательских объектов и реализация Generic TreeMap с интерфейсом компаратора и внутренней работой карты дерева будут обсуждаться в следующих сообщениях

4. Наблюдения

4. Сложности и производительность небезопасных для потоков карт

Сложности

Тест производительности

  1. Я провел тест производительности между картами
  2. Я взял Пул из 5 потокови каждый поток может выполнять 5 00 000 операций ввода и получения. Я сделал так5 раз и каждый раз рассчитывал время выполнения для каждого пула потокови, наконец, Я рассчитал среднее время

Результат