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

Java ConcurrentHashMap

Java ConcurrentHashMap

В этом руководстве мы узнаем о классе Java ConcurrentHashMap и его операциях с помощью примеров.

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

Он реализует интерфейс ConcurrentMap.

<час>

Создать ConcurrentHashMap

Чтобы создать параллельную хэш-карту, мы должны импортировать java.util.concurrent.ConcurrentHashMap пакет первый. Как только мы импортируем пакет, вот как мы можем создавать параллельные хэш-карты в Java.

// ConcurrentHashMap with capacity 8 and load factor 0.6
ConcurrentHashMap<Key, Value> numbers = new ConcurrentHashMap<>(8, 0.6f);

В приведенном выше коде мы создали параллельную хэш-карту с именем numbers. .

Здесь

Обратите внимание на часть new ConcurrentHashMap<>(8, 0.6) . Здесь первым параметром является вместимость. а второй параметр — коэффициент нагрузки. .

Емкость и коэффициент загрузки по умолчанию

Можно создать параллельную хэш-карту без определения ее емкости и коэффициента загрузки. Например,

// ConcurrentHashMap with default capacity and load factor
ConcurrentHashMap<Key, Value> numbers1 = new ConcurrentHashMap<>();

По умолчанию

<час>

Создание ConcurrentHashMap из других карт

Вот как мы можем создать параллельную хэш-карту, содержащую все элементы других карт.

import java.util.concurrent.ConcurrentHashMap;
import java.util.HashMap;

class Main {
    public static void main(String[] args) {

        // Creating a hashmap of even numbers
        HashMap<String, Integer> evenNumbers = new HashMap<>();
        evenNumbers.put("Two", 2);
        evenNumbers.put("Four", 4);
        System.out.println("HashMap: " + evenNumbers);

        // Creating a concurrent hashmap from other map
        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 класс предоставляет методы, которые позволяют нам выполнять различные операции на карте.

<час>

Вставить элементы в ConcurrentHashMap

Например,

import java.util.concurrent.ConcurrentHashMap;

class Main {
    public static void main(String[] args) {
        // Creating ConcurrentHashMap of even numbers
        ConcurrentHashMap<String, Integer> evenNumbers = new ConcurrentHashMap<>();

        // Using put()
        evenNumbers.put("Two", 2);
        evenNumbers.put("Four", 4);

        // Using putIfAbsent()
        evenNumbers.putIfAbsent("Six", 6);
        System.out.println("ConcurrentHashMap of even numbers: " + evenNumbers);

        //Creating ConcurrentHashMap of numbers
        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
        numbers.put("One", 1);

        // Using putAll()
        numbers.putAll(evenNumbers);
        System.out.println("ConcurrentHashMap of numbers: " + numbers);
    }
}

Вывод

ConcurrentHashMap of even numbers: {Six=6, Four=4, Two=2}
ConcurrentHashMap of numbers: {Six=6, One=1, Four=-4, Two=2}
<час>

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

<сильный>1. Использование entrySet(), keySet() и values()

Например,

import java.util.concurrent.ConcurrentHashMap;

class Main {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();

        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("ConcurrentHashMap: " + numbers);

        // Using entrySet()
        System.out.println("Key/Value mappings: " + numbers.entrySet());

        // Using keySet()
        System.out.println("Keys: " + numbers.keySet());

        // Using values()
        System.out.println("Values: " + numbers.values());
    }
}

Вывод

ConcurrentHashMap: {One=1, Two=2, Three=3}
Key/Value mappings: [One=1, Two=2, Three=3]
Keys: [One, Two, Three]
Values: [1, 2, 3]

<сильный>2. Использование get() и getOrDefault()

Например,

import java.util.concurrent.ConcurrentHashMap;

class Main {
    public static void main(String[] args) {

        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("ConcurrentHashMap: " + numbers);

        // Using get()
        int value1 = numbers.get("Three");
        System.out.println("Using get(): " + value1);

        // Using getOrDefault()
        int value2 = numbers.getOrDefault("Five", 5);
        System.out.println("Using getOrDefault(): " + value2);
    }
}

Вывод

ConcurrentHashMap: {One=1, Two=2, Three=3}
Using get(): 3
Using getOrDefault(): 5
<час>

Удалить элементы ConcurrentHashMap

Например,

import java.util.concurrent.ConcurrentHashMap;

class Main {
    public static void main(String[] args) {

        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("ConcurrentHashMap: " + numbers);

        // remove method with single parameter
        int value = numbers.remove("Two");
        System.out.println("Removed value: " + value);

        // remove method with two parameters
        boolean result = numbers.remove("Three", 3);
        System.out.println("Is the entry {Three=3} removed? " + result);

        System.out.println("Updated ConcurrentHashMap: " + numbers);
    }
}

Вывод

ConcurrentHashMap: {One=1, Two=2, Three=3}
Removed value: 2
Is the entry {Three=3} removed? True
Updated ConcurrentHashMap: {One=1}
<час>

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

ConcurrentHashMap класс предоставляет различные массовые операции, которые можно безопасно применять к параллельным картам.

1. Метод forEach()

forEach() метод перебирает наши записи и выполняет указанную функцию.

Он включает два параметра.

Например,

import java.util.concurrent.ConcurrentHashMap;

class Main {
    public static void main(String[] args) {

        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("ConcurrentHashMap: " + numbers);

        // forEach() without transformer function
        numbers.forEach(4, (k, v) -> System.out.println("key: " + k + " value: " + v));

        // forEach() with transformer function
        System.out.print("Values are ");
        numbers.forEach(4, (k, v) -> v, (v) -> System.out.print(v + ", "));
    }
}

Вывод

ConcurrentHashMap: {One = 1, Two = 2, Three = 3}
key: One value: 1
key: Two value: 2
key: Three value: 3
Values are 1, 2, 3,

В приведенной выше программе мы использовали параллельный порог 4. . Это означает, что если карта содержит 4 записи, операция будет выполняться параллельно.

Вариант метода forEach()

<час>

2. Метод поиска()

search() метод ищет карту на основе указанной функции и возвращает совпадающую запись.

Здесь указанная функция определяет, какую запись следует искать.

Он также включает необязательный параметр parallelThreshold. . Порог параллелизма указывает, после какого количества элементов на карте операция выполняется параллельно.

Например,

import java.util.concurrent.ConcurrentHashMap;

class Main {
    public static void main(String[] args) {

        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("ConcurrentHashMap: " + numbers);

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

    }
}

Вывод

ConcurrentHashMap: {One=1, Two=2, Three=3}
Searched value: Three

Варианты метода search()

<час>

3. Метод уменьшения()

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

Он включает два параметра.

Например,

import java.util.concurrent.ConcurrentHashMap;

class Main {
    public static void main(String[] args) {

        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("ConcurrentHashMap: " + numbers);

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

    }
}

Вывод

ConcurrentHashMap: {One=1, Two=2, Three=3}
Sum of all values: 6

В приведенной выше программе обратите внимание на оператор

numbers.reduce(4, (k, v) -> v, (v1, v2) -> v1+v2);

Здесь

Варианты метода reduce()

<час>

ConcurrentHashMap и HashMap

Вот некоторые различия между ConcurrentHashMap и HashMap,

<час>

Почему ConcurrentHashMap?


java

  1. Операторы Java
  2. Java-комментарии
  3. Java для каждого цикла
  4. Java-строки
  5. Java-интерфейс
  6. Анонимный класс Java
  7. Java-проба с ресурсами
  8. Java-аннотации
  9. Утверждения Java
  10. Java-алгоритмы