Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Освоение Java ConcurrentHashMap: операции, примеры и лучшие практики

Java ConcurrentHashMap

Изучите класс Java ConcurrentHashMap, научитесь создавать и манипулировать им, и откройте его ключевые преимущества с практическими примерами кода.

Класс ConcurrentHashMap из Java Collections Framework предлагает потокобезопасную реализацию карты. Несколько потоков могут одновременно читать и писать без повреждения целостности карты.

Он реализует интерфейс ConcurrentMap и является частью java.util.concurrent.


Создание ConcurrentHashMap

Сначала импортируйте класс:

import java.util.concurrent.ConcurrentHashMap;

Затем создайте экземпляр. Можно указать начальную ёмкость и коэффициент загрузки, или положиться на значения по умолчанию.

// Ёмкость 8, коэффициент загрузки 0.6
ConcurrentHashMap<Key, Value> numbers = new ConcurrentHashMap<>(8, 0.6f);

Параметры

Конструктор по умолчанию создаёт карту с ёмкостью 16 и коэффициентом загрузки 0.75:

ConcurrentHashMap<Key, Value> numbers1 = new ConcurrentHashMap<>();

Создание ConcurrentHashMap из существующих карт

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

import java.util.concurrent.ConcurrentHashMap;
import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> evenNumbers = new HashMap<>();
        evenNumbers.put("Two", 2);
        evenNumbers.put("Four", 4);
        System.out.println("HashMap: " + evenNumbers);
        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>(evenNumbers);
        numbers.put("Three", 3);
        System.out.println("ConcurrentHashMap: " + numbers);
    }
}

Вывод

HashMap: {Four=4, Two=2} ConcurrentHashMap: {Four=4, Two=2, Three=3}

Ключевые методы ConcurrentHashMap

Вставка элементов

ConcurrentHashMap<String, Integer> evenNumbers = new ConcurrentHashMap<>();
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
evenNumbers.putIfAbsent("Six", 6);
System.out.println("Even numbers: " + evenNumbers);
ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.putAll(evenNumbers);
System.out.println("Numbers: " + numbers);

Вывод

Even numbers: {Six=6, Four=4, Two=2} Numbers: {Six=6, One=1, Four=4, Two=2}

Доступ к элементам

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

ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("Map: " + numbers);
System.out.println("Entries: " + numbers.entrySet());
System.out.println("Keys: " + numbers.keySet());
System.out.println("Values: " + numbers.values());
int val = numbers.get("Three");
System.out.println("get(\"Three\"): " + val);
int def = numbers.getOrDefault("Five", 5);
System.out.println("getOrDefault(\"Five\", 5): " + def);

Вывод

Map: {One=1, Two=2, Three=3} Entries: [One=1, Two=2, Three=3] Keys: [One, Two, Three] Values: [1, 2, 3] get("Three"): 3 getOrDefault("Five", 5): 5

Удаление записей

ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
int removed = numbers.remove("Two");
System.out.println("Removed value: " + removed);
boolean deleted = numbers.remove("Three", 3);
System.out.println("Entry {Three=3} removed? " + deleted);
System.out.println("Updated map: " + numbers);

Вывод

Removed value: 2 Entry {Three=3} removed? true Updated map: {One=1}

Массовые операции

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

forEach()

Итерирует по записям, опционально в параллели, и применяет consumer.

numbers.forEach(4, (k, v) -> System.out.println("key: " + k + " value: " + v));
// С трансформером:
numbers.forEach(4, (k, v) -> v, (v) -> System.out.print(v + ", "));

Здесь 4 — порог параллелизма — когда в карте минимум 4 элемента, операция может выполняться параллельно.

search()

Находит запись, удовлетворяющую предикату. Возвращает первое совпадение.

String key = numbers.search(4, (k, v) -> v == 3 ? k : null);
System.out.println("Searched key: " + key);

reduce()

Агрегирует значения с помощью редуктора. Полезно для сумм, произведений или пользовательских накоплений.

int sum = numbers.reduce(4, (k, v) -> v, (v1, v2) -> v1 + v2);
System.out.println("Sum of values: " + sum);

ConcurrentHashMap против HashMap

Зачем использовать ConcurrentHashMap?

java

  1. Освоение операторов Java: типы, синтаксис и практические примеры
  2. Комментарии в Java: типы, использование и лучшие практики
  3. Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
  4. Освоение строк в Java: создание, методы и лучшие практики
  5. Интерфейсы в Java: концепции, реализация и лучшие практики
  6. Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
  7. Try-with-resources в Java: автоматическое управление ресурсами
  8. Аннотации в Java: типы, размещение и практические примеры
  9. Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
  10. Освоение алгоритмов Java Collections: сортировка, перемешивание и многое другое