Diferencia entre ConcurrentHashMap, HashTable y Synchronized Map en Java

Aquí discutiremos uno por uno individualmente y luego pasaremos a la diferencia después de tener una comprensión adecuada de los tres. Hablaremos primero de ConcurrentHashMap, seguido de HashTable, y finalmente de Synchronized Map. Comencemos con ConcurrentHashMap primero.

La estructura de datos subyacente para ConcurrentHashMap es HashTable . ConcurrentHashMap permite operaciones simultáneas de lectura y actualización segura para subprocesos. Para realizar la operación de lectura, el subproceso no requerirá ningún bloqueo, pero para realizar la operación de actualización, el subproceso requiere un bloqueo, pero es el bloqueo de solo una parte particular del Mapa (bloqueo de nivel de cubo). En lugar de una actualización concurrente de todo el mapa, se logra dividiendo internamente el mapa en una porción más pequeña que se define por el nivel de concurrencia. El nivel de concurrencia predeterminado es 16, es decir, ConcurrentHashMap permite operaciones simultáneas de lectura y 16 de escritura (actualización). El valor nulo no está permitido tanto para claves como para valores. Mientras un subproceso está iterando, el otro subproceso puede realizar una operación de actualización y ConcurrentHashMap nunca lanza ConcurrentModificationException.

Sintaxis:

ConcurrentHashMap<K,V> CHM = new  ConcurrentHashMap<>();

El constructor anterior crea un ConcurrentHashMap vacío con 

  • La capacidad inicial predeterminada es igual a 16
  • La relación de llenado predeterminada es igual a 0,75
  • Nivel de simultaneidad predeterminado 16 donde K es clave y V es el valor de ConcurrentHashMap

Ejemplo:

Java

// Java program to illustrate ConcurrentHashMap
 
// Importing required packages
import java.io.*;
import java.util.*;
import java.util.concurrent.*;
 
// Main class
public class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Creating ConcurrentHashMap class object
        // Declaring object of integer an string type
        ConcurrentHashMap<Integer, String> chm
            = new ConcurrentHashMap<>();
 
        // Adding entry to ConcurrentHashMap
        // Custom input entries
        chm.put(65, "A");
        chm.put(66, "B");
 
        // Print and display the ConcurrentHashMap
        System.out.println(chm);
 
        // Adding the entry if the given entry is not
        // present in the ConcurrentHashMap Custom input
        // entries
        chm.putIfAbsent(67, "C");
        chm.putIfAbsent(68, "D");
 
        // Printand display the ConcurrentHashMap
        System.out.println(chm);
 
        // Removing entry With Key and Value as 68 and D
        chm.remove(68, "D");
 
        // Print and display the ConcurrentHashMap
        System.out.println(chm);
 
        // Replacing  Value of an entry
        chm.replace(66, "B", "E");
 
        // Again, print and display the ConcurrentHashMap
        System.out.println(chm);
    }
}
Producción

{65=A, 66=B}
{65=A, 66=B, 67=C, 68=D}
{65=A, 66=B, 67=C}
{65=A, 66=E, 67=C}

Ahora deteniéndonos en el segundo concepto que es HashTable . La estructura de datos subyacente para HashTable es HashTable. El orden de inserción en HashTable no se conserva y se basa en el código hash de las claves. No se permiten claves duplicadas, pero se pueden duplicar valores. Se permiten objetos heterogéneos tanto para claves como para valores. El valor nulo no está permitido tanto para la clave como para el valor; de lo contrario, obtendremos RunTimeException diciendo NullPointerException. Implementa interfaces serializables y clonables pero no RandomAccess. Cada método dentro de él está sincronizado y, por lo tanto, los objetos HashTable son seguros para subprocesos. HashTable es la mejor opción si nuestra operación frecuente es la operación de búsqueda.

Sintaxis: 

Hashtable<K,V> ht = new Hashtable<>();

El constructor anterior crea un objeto de tabla hash vacío con una capacidad predeterminada inicial de 11 y una tasa de llenado predeterminada de 0,75. Donde K es clave y V es el valor de una tabla hash.

Ejemplo: 

Java

// Java program to illustrate HashTable
 
// Importing required packages
import java.io.*;
import java.util.*;
 
// Main class
class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Creating Hashtable object
        Hashtable<Integer, String> ht = new Hashtable<>();
 
        // Adding entry to Hashtable
        // Custom input entries
        ht.put(65, "A");
        ht.put(66, "B");
        ht.put(67, "C");
        ht.put(68, "D");
 
        // Print and display the HashTable elements
        System.out.println(ht);
    }
}
Producción

{65=A, 68=D, 67=C, 66=B}

Por último, discutiendo el   Mapa Sincronizado antes de llegar a las diferencias concluyentes entre los tres. El métodosynchronedMap() se utiliza para devolver un mapa sincronizado (seguro para subprocesos) respaldado por el mapa especificado. Este método está presente en java.util.Collections.

Sintaxis: 

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> M)

// where M is the map to be synchronized K is key 
//   and V is value for the resultant synchronized map.    

Ejemplo:

Java

// Java program to demonstrate synchronizedMap() method
 
// Importing required packages
import java.io.*;
import java.util.*;
 
// Main class
public class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Try block to check for exceptions
        try {
 
            // Creating object of HashMap
            // Declaring object of integer and string type
            HashMap<Integer, String> map = new HashMap<>();
 
            // Adding entry to map object created above
            // Custom input entries
            map.put(65, "A");
            map.put(66, "B");
            map.put(67, "C");
            map.put(68, "D");
 
            // Print and display the map object
            System.out.println("Map is " + map);
 
            // Creating a synchronized map object
            // Declaring object of type integer and string
            Map<Integer, String> synmap
                = Collections.synchronizedMap(map);
 
            // Print and display the synchronized map
            // elements
            System.out.println("Synchronized map is : "
                               + synmap);
        }
 
        // Catch block to handle the exceptions
        catch (IllegalArgumentException e) {
 
            // Display the exception on the console
            System.out.println(e);
        }
    }
}
Producción

Map is {65=A, 66=B, 67=C, 68=D}
Synchronized map is : {65=A, 66=B, 67=C, 68=D}

Hasta ahora hemos discutido lo suficiente los conceptos junto con el trabajo interno a través de la implementación en los programas. Finalmente, concluyamos las diferencias entre ellos para obtener un control estricto y comprender la diferencia mínima entre ellos.

        ConcurrentHashMapConcurrentHashMap                  Mapa Sincronizado                    Tabla de picadillo
Obtendremos seguridad de subprocesos sin bloquear el objeto de mapa total solo con un bloqueo de nivel de cubo. Obtendremos seguridad de subprocesos bloqueando todo el objeto del mapa. Obtendremos seguridad de subprocesos bloqueando todo el objeto del mapa
A la vez, se permite que varios subprocesos operen en los objetos del mapa de forma segura. A la vez, solo un subproceso puede realizar cualquier operación en un objeto de mapa. A la vez, un subproceso puede operar en un objeto de mapa.
La operación de lectura se puede realizar sin bloqueo, pero la operación de escritura se puede realizar con bloqueo de nivel de depósito. Cada operación de lectura y escritura requería un objeto de mapa total  Cada operación de lectura y escritura requería un objeto de mapa total 
Mientras un subproceso itera los objetos del mapa, el otro subproceso puede modificar el mapa y no obtendrá ConcurrentModificationException. Mientras un subproceso itera el objeto del mapa, los otros subprocesos no pueden modificar el mapa; de lo contrario, obtendremos ConcurrentModificationException Mientras un subproceso itera el objeto del mapa, los otros subprocesos no pueden modificar el mapa; de lo contrario, obtendremos ConcurrentModificationException
El iterador de ConcurrentHashMap es a prueba de fallas y no generará ConcurrentModificationException El iterador de SynchronizedMap falla rápidamente y generará ConcurrentModificationException El iterador de HashTable falla rápidamente y generará ConcurrentModificationException
Nulo no está permitido tanto para claves como para valores. Null está permitido tanto para claves como para valores. Nulo no está permitido tanto para claves como para valores.
Introducir en la versión java 1.5 Introducir en la versión java 1.2 Introducir en la versión java 1.0

Publicación traducida automáticamente

Artículo escrito por mroshanmishra0072 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 *