Interfaz de mapa concurrente en java

ConcurrentMap es una interfaz y es miembro de Java Collections Framework , que se introdujo en JDK 1.5 y representa un mapa que es capaz de manejar el acceso simultáneo sin afectar la consistencia de las entradas en un mapa. Interfaz ConcurrentMap presente en el paquete java.util.concurrent . Proporciona algunos métodos adicionales además de lo que hereda de SuperInterface, es decir, java.util.Map . Ha heredado el Map.Entry de interfaz anidada<K, V>

Las operaciones de HashMap no están sincronizadas, mientras que Hashtable proporciona sincronización. Aunque Hashtable es seguro para subprocesos, no es muy eficiente. Para resolver este problema, Java Collections Framework introdujo ConcurrentMap en Java 1.5.

La jerarquía de ConcurrentMap
 

ConcurrentMap Interface in java

Declaración:

public interface ConcurrentMap<K,V> extends Map<K,V>

Aquí, K es el tipo de objeto clave y V es el tipo de objeto de valor.

Implementando Clases

Como pertenece al paquete java.util.concurrent , debemos importarlo usando

import java.util.concurrent.ConcurrentMap
                or
import java.util.concurrent.*

El ConcurrentMap tiene dos clases de implementación que son ConcurrentSkipListMap y ConcurrentHashMap . ConcurrentSkipListMap es una implementación escalable de la interfaz ConcurrentNavigableMap que amplía la interfaz ConcurrentMap. Las claves en ConcurrentSkipListMap se clasifican por orden natural o mediante el uso de un comparador en el momento de la construcción del objeto. El ConcurrentSkipListMap tiene el costo de tiempo esperado de log(n) para las operaciones de inserción, eliminación y búsqueda. Es una clase segura para subprocesos, por lo tanto, todas las operaciones básicas se pueden realizar al mismo tiempo.

Sintaxis:

// ConcurrentMap implementation by ConcurrentHashMap
CocurrentMap<K, V> numbers = new ConcurrentHashMap<K, V>();

// ConcurrentMap implementation by ConcurrentSkipListMap
ConcurrentMap< ? , ? > objectName = new ConcurrentSkipListMap< ? , ? >();

Ejemplo:
 

Java

// Java Program to illustrate methods
// of ConcurrentMap interface
import java.util.concurrent.*;
  
class ConcurrentMapDemo {
  
    public static void main(String[] args)
    {
        // Since ConcurrentMap is an interface,
        // we create instance using ConcurrentHashMap
        ConcurrentMap<Integer, String> m = new ConcurrentHashMap<Integer, String>();
        m.put(100, "Geeks");
        m.put(101, "For");
        m.put(102, "Geeks");
  
        // Here we cant add Hello because 101 key
        // is already present
        m.putIfAbsent(101, "Hello");
  
        // We can remove entry because 101 key
        // is associated with For value
        m.remove(101, "For");
  
        // Now we can add Hello
        m.putIfAbsent(101, "Hello");
  
        // We can replace Hello with For
        m.replace(101, "Hello", "For");
        System.out.println("Map contents : " + m);
    }
}
Producción

Map contents : {100=Geeks, 101=For, 102=Geeks}

 
 

Métodos básicos

1. Agregar elementos

El método put() de ConcurrentSkipListMap es una función integrada en Java que asocia el valor especificado con la clave especificada en este mapa. Si el mapa contenía anteriormente una asignación para la clave, se reemplaza el valor anterior.

Java

// Java Program to demonstrate adding
// elements
  
import java.util.concurrent.*;
  
class AddingElementsExample {
    public static void main(String[] args)
    {
        // Instantiate an object
        // Since ConcurrentMap
        // is an interface so We use
        // ConcurrentSkipListMap
        ConcurrentMap<Integer, Integer> mpp = new ConcurrentSkipListMap<Integer, Integer>();
  
        // Adding elements to this map
          // using put() method
        for (int i = 1; i <= 5; i++)
            mpp.put(i, i);
  
        // Print map to the console
        System.out.println("After put(): " + mpp);
    }
}
Producción

After put(): {1=1, 2=2, 3=3, 4=4, 5=5}

2. Eliminar elementos

El método remove() de ConcurrentSkipListMap es una función integrada en Java que elimina la asignación de la clave especificada de esta asignación. El método devuelve nulo si no hay una asignación para esa clave en particular. Después de realizar este método, se reduce el tamaño del mapa.

Java

// Java Program to demonstrate removing
// elements
  
import java.util.concurrent.*;
  
class RemovingElementsExample {
    public static void main(String[] args)
    {
        // Instantiate an object
        // Since ConcurrentMap
        // is an interface so We use
        // ConcurrentSkipListMap
        ConcurrentMap<Integer, Integer> mpp = new ConcurrentSkipListMap<Integer, Integer>();
  
        // Adding elements to this map
        // using put method
        for (int i = 1; i <= 5; i++)
            mpp.put(i, i);
  
        // remove() mapping associated
        // with key 1
        mpp.remove(1);
  
        System.out.println("After remove(): " + mpp);
    }
}
Producción

After remove(): {2=2, 3=3, 4=4, 5=5}

3. Accediendo a los Elementos

Podemos acceder a los elementos de un ConcurrentSkipListMap usando el método get(), el ejemplo de esto se da a continuación.

Java

// Java Program to demonstrate accessing
// elements
  
import java.util.concurrent.*;
  
class AccessingElementsExample {
  
    public static void main(String[] args)
    {
  
        // Instantiate an object
        // Since ConcurrentMap
        // is an interface so We use
        // ConcurrentSkipListMap
        ConcurrentMap<Integer, String> chm = new ConcurrentSkipListMap<Integer, String>();
  
        // insert mappings using put method
        chm.put(100, "Geeks");
        chm.put(101, "for");
        chm.put(102, "Geeks");
        chm.put(103, "Contribute");
  
        // Displaying the HashMap
        System.out.println("The Mappings are: ");
        System.out.println(chm);
  
        // Display the value of 100
        System.out.println("The Value associated to "
                           + "100 is : " + chm.get(100));
  
        // Getting the value of 103
        System.out.println("The Value associated to "
                           + "103 is : " + chm.get(103));
    }
}
Producción

The Mappings are: 
{100=Geeks, 101=for, 102=Geeks, 103=Contribute}
The Value associated to 100 is : Geeks
The Value associated to 103 is : Contribute

4. Atravesando

Podemos usar la interfaz Iterator para atravesar cualquier estructura del marco de colección. Dado que los iteradores trabajan con un tipo de datos, usamos Entry< ? , ? > para resolver los dos tipos separados en un formato compatible. Luego, usando el método next() imprimimos los elementos del ConcurrentSkipListMap.

Java

import java.util.concurrent.*;
import java.util.*;
  
public class TraversingExample {
  
    public static void main(String[] args)
    {
  
        // Instantiate an object
        // Since ConcurrentMap
        // is an interface so We use
        // ConcurrentSkipListMap
        ConcurrentMap<Integer, String> chmap = new ConcurrentSkipListMap<Integer, String>();
  
        // Add elements using put()
        chmap.put(8, "Third");
        chmap.put(6, "Second");
        chmap.put(3, "First");
        chmap.put(11, "Fourth");
  
        // Create an Iterator over the
        // ConcurrentSkipListMap
        Iterator<ConcurrentSkipListMap
                     .Entry<Integer, String> > itr
            = chmap.entrySet().iterator();
  
        // The hasNext() method is used to check if there is
        // a next element The next() method is used to
        // retrieve the next element
        while (itr.hasNext()) {
            ConcurrentSkipListMap
                .Entry<Integer, String> entry
                = itr.next();
            System.out.println("Key = " + entry.getKey()
                               + ", Value = "
                               + entry.getValue());
        }
    }
}
Producción

Key = 3, Value = First
Key = 6, Value = Second
Key = 8, Value = Third
Key = 11, Value = Fourth

Métodos de ConcurrentMap

  • K – El tipo de claves en el mapa.
  • V – El tipo de valores mapeados en el mapa.

MÉTODO

DESCRIPCIÓN

calcular (tecla K, BiFunction<? super K,? super

 V,? extiende V> función de reasignación)

Intenta calcular una asignación para la clave especificada y su valor asignado actual (o nulo si no hay una asignación actual).
ComputeIfAbsent (tecla K, función <? super K,? extiende V> función de mapeo) Si la clave especificada aún no está asociada con un valor (o está asignada a un valor nulo), intenta calcular su valor utilizando la función de asignación dada y lo ingresa en este mapa a menos que sea nulo.
ComputeIfPresent​(tecla K, BiFunction<? super K,? super V,? extiende V> función de reasignación) Si el valor de la clave especificada está presente y no es nulo, intenta calcular una nueva asignación dada la clave y su valor asignado actual.
forEach​(Acción BiConsumer<? super K,? super V>) Realiza la acción dada para cada entrada en este mapa hasta que todas las entradas hayan sido procesadas o la acción arroje una excepción.
getOrDefault​(Clave de objeto, V valor predeterminado) Devuelve el valor al que se asigna la clave especificada o defaultValue si este mapa no contiene ninguna asignación para la clave.
 fusionar (tecla K, valor V, BiFunction<? super V,? super V,? extiende V> función de reasignación) Si la clave especificada aún no está asociada con un valor o está asociada con un valor nulo, la asocia con el valor no nulo proporcionado.
 putIfAbsent​(clave K, valor V) Si la clave especificada aún no está asociada con un valor, la asocia con el valor dado.
 eliminar (clave de objeto, valor de objeto) Elimina la entrada de una clave solo si actualmente está asignada a un valor dado.
 reemplazar (tecla K, valor V) Reemplaza la entrada de una clave solo si actualmente está asignada a algún valor.
 reemplazar (tecla K, V valor anterior, V valor nuevo) Reemplaza la entrada de una clave solo si actualmente está asignada a un valor dado.
 replaceAll​(BiFunction<? super K,? super V,? extiende la función V>) Reemplaza el valor de cada entrada con el resultado de invocar la función dada en esa entrada hasta que se hayan procesado todas las entradas o la función produzca una excepción.

Métodos heredados de la interfaz java.util.Map

MÉTODO

DESCRIPCIÓN

 clear() Elimina todas las asignaciones de este mapa (operación opcional).
 containsKey​(clave de objeto) Devuelve verdadero si este mapa contiene un mapeo para la clave especificada.
 contiene valor (valor del objeto) Devuelve verdadero si este mapa asigna una o más claves al valor especificado.
entrada​(K k, V v) Devuelve un Map.Entry inmutable que contiene la clave y el valor dados.
 conjunto de entrada() Devuelve una vista de conjunto de las asignaciones contenidas en este mapa.
 es igual a​(Objeto o) Compara el objeto especificado con este mapa para la igualdad.
 obtener (clave de objeto) Devuelve el valor al que se asigna la clave especificada, o nulo si este mapa no contiene ninguna asignación para la clave.
 código hash() Devuelve el valor del código hash para este mapa.
está vacío() Devuelve verdadero si este mapa no contiene asignaciones de clave-valor.
conjunto de teclas() Devuelve una vista de conjunto de las claves contenidas en este mapa.
de() Devuelve un mapa inmutable que contiene cero asignaciones.
de (K k1, V v1) Devuelve un mapa inmutable que contiene un solo mapeo.
de (K k1, V v1, K k2, V v2) Devuelve un mapa inmutable que contiene dos asignaciones.
de (K k1, V v1, K k2, V v2, K k3, V v3) Devuelve un mapa inmutable que contiene tres asignaciones.
de (K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) Devuelve un mapa inmutable que contiene cuatro asignaciones.
de​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) Devuelve un mapa inmutable que contiene cinco asignaciones.
de​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) Devuelve un mapa inmutable que contiene seis asignaciones.
de​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) Devuelve un mapa inmutable que contiene siete asignaciones.
de​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8 ) Devuelve un mapa inmutable que contiene ocho asignaciones.
de​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8 , Kk9, Vv9) Devuelve un mapa inmutable que contiene nueve asignaciones.
de​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8 , Kk9, Vv9, Kk10, Vv10) Devuelve un mapa inmutable que contiene diez asignaciones.
ofEntries​(Map.Entry<? extiende K,? extiende V>… entradas) Devuelve un mapa inmutable que contiene claves y valores extraídos de las entradas dadas.
poner (tecla K, valor V) Asocia el valor especificado con la clave especificada en este mapa (operación opcional).
putAll​(Mapa<? extiende K,? extiende V> m) Copia todas las asignaciones del mapa especificado a este mapa (operación opcional).
eliminar (tecla de objeto) Elimina el mapeo de una clave de este mapa si está presente (operación opcional).
tamaño() Devuelve el número de asignaciones de clave-valor en esta asignación.
valores​() Devuelve una vista de colección de los valores contenidos en este mapa.

Referencia: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ConcurrentMap.html

Publicación traducida automáticamente

Artículo escrito por Bishal Kumar Dubey y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *