CopyOnWriteArraySet en Java

CopyOnWriteArraySet es miembro de Java Collections Framework . Es un conjunto que utiliza un CopyOnWriteArrayList interno para todas sus operaciones. Se introdujo en JDK 1.5, podemos decir que es una versión segura de subprocesos de Set. Para usar esta clase, debemos importarla desde el paquete java.util.concurrent

CopyOnWriteArraySet in java

Comparte algunas propiedades de Set y también tiene sus propias propiedades, como se indica:

  • La implementación interna de CopyOnWriteArraySet es solo CopyOnWriteArrayList .
  • Múltiples subprocesos pueden realizar operaciones de actualización simultáneamente, pero para cada operación de actualización, se crea una copia clonada por separado. Como para cada actualización, se creará una nueva copia clonada, lo cual es costoso. Por lo tanto, si se requieren varias operaciones de actualización, no se recomienda utilizar CopyOnWriteArraySet.
  • Mientras un subproceso itera el Conjunto, otros subprocesos pueden realizar la actualización, aquí no obtendremos ninguna excepción de tiempo de ejecución como ConcurrentModificationException .
  • Un iterador de la clase CopyOnWriteArraySet solo puede realizar solo lectura y no debe realizar la eliminación; de lo contrario, obtendremos la excepción de tiempo de ejecución UnsupportedOperationException .
  • Utilice CopyOnWriteArraySet en aplicaciones en las que los tamaños de los conjuntos suelen ser pequeños, las operaciones de solo lectura superan con creces a las operaciones mutativas y necesita evitar la interferencia entre subprocesos durante el recorrido.
  • CopyOnWriteArraySet ayuda a minimizar los pasos de sincronización controlados por el programador y a mover el control a API integradas y bien probadas.

La jerarquía de clases es la siguiente:

java.lang.Object
   ↳ java.util.AbstractCollection<E>
        ↳ java.util.AbstractSet<E>
             ↳ java.util.concurrent.CopyOnWriteArraySet<E>

Sintaxis: Declaración

public class CopyOnWriteArraySet<E> extends AbstractSet<E> implements Serializable

Aquí, E es el tipo de elementos almacenados en esta Colección. Implementa interfaces Serializable , Iterable<E> , Collection<E> , Set<E> .

Constructores de CopyOnWriteArraySet 

1. CopyOnWriteArraySet() : crea un conjunto vacío.

CopyOnWriteArraySet<E> c = new CopyOnWriteArraySet<E>();

2. CopyOnWriteArraySet(Collection c) : crea un conjunto que contiene todos los elementos de la colección especificada.

CopyOnWriteArraySet<E> c = new CopyOnWriteArraySet<E>(Collection c);

Ejemplo:

Java

// Java Program to Illustrate CopyOnWriteArraySet Class
 
// Importing required classes
import java.util.*;
import java.util.concurrent.*;
 
// Main class
class ConcurrentDemo extends Thread {
 
    static CopyOnWriteArraySet l
        = new CopyOnWriteArraySet();
 
    // Method
    public void run()
    {
        // Child thread trying to add
        // new element in the Set object
        l.add("D");
    }
 
    // Method 2
    // Main driver method
    public static void main(String[] args)
    {
 
        // Adding elements
        // using add() method
        l.add("A");
        l.add("B");
        l.add("C");
 
        // We create a child thread
        // that is going to modify
        // CopyOnWriteArraySet l.
        ConcurrentDemo t = new ConcurrentDemo();
 
        // Running the child thread
        // using start() method
        t.start();
 
        // Waiting for the thread to
        // add the element
 
        // Try block to check for exceptions
        try {
 
            Thread.sleep(2000);
        }
 
        // Catch block to handle exceptions
        catch (InterruptedException e) {
 
            // Print statement
            System.out.println(
                "child going to add element");
        }
 
        System.out.println(l);
 
        // Now we iterate through the
        // CopyOnWriteArraySet and we
        // wont get exception.
        Iterator itr = l.iterator();
 
        while (itr.hasNext()) {
 
            String s = (String)itr.next();
            System.out.println(s);
 
            if (s.equals("C")) {
 
                // Here we will get
                // RuntimeException
                itr.remove();
            }
        }
    }
}

 Producción: 

Iterando sobre CopyOnWriteArraySet

Podemos iterar sobre los elementos contenidos en este conjunto en el orden en que estos elementos fueron agregados usando el método iterator() . El iterador devuelto proporciona una instantánea inmutable del estado del conjunto cuando se construyó el iterador. Debido a esta propiedad, GeeksforGeeks no se imprime en la primera iteración. No se requiere sincronización durante la iteración. El iterador no admite el método de eliminación. 

Ejemplo:

Java

// Java program to Illustrate Iterating Over
// CopyOnWriteArraySet class
 
// Importing required classes
import java.io.*;
import java.util.*;
import java.util.concurrent.*;
 
// Main class
// IteratingCopyOnWriteArraySet
class GFG {
 
    // Main class
    public static void main(String[] args)
    {
 
        // Creating an instance of CopyOnWriteArraySet
        CopyOnWriteArraySet<String> set
            = new CopyOnWriteArraySet<>();
 
        // Initial an iterator
        Iterator itr = set.iterator();
 
        // Adding elements
        // using add() method
        set.add("GeeksforGeeks");
 
        // Display message only
        System.out.println("Set contains: ");
 
        // Printing the contents
        // of set to the console
        while (itr.hasNext())
            System.out.println(itr.next());
 
        // Iterator after adding an element
        itr = set.iterator();
 
        // Display message only
        System.out.println("Set contains:");
 
        // Printing the elements to the console
        while (itr.hasNext())
            System.out.println(itr.next());
    }
}
Producción:

Set contains: 
Set contains:
GeeksforGeeks

 Métodos en CopyOnWriteArraySet

Método

Acción realizada

añadir (E mi) Agrega el elemento especificado a este conjunto si aún no está presente.
addAll(Colección<? extiende E> c) Agrega todos los elementos de la colección especificada a este conjunto si aún no están presentes.
clear() Elimina todos los elementos de este conjunto.
contiene(Objeto o) Devuelve verdadero si este conjunto contiene el elemento especificado.
contieneTodo(Colección<?> c) Devuelve verdadero si este conjunto contiene todos los elementos de la colección especificada.
es igual a (Objeto o) Compara el objeto especificado con este conjunto para la igualdad.
forEach(Consumidor<? super E> acción) Realiza la acción dada para cada elemento del iterable hasta que se hayan procesado todos los elementos o la acción genere una excepción.
esta vacio() Devuelve verdadero si este conjunto no contiene elementos.
 iterador() Devuelve un iterador sobre los elementos contenidos en este conjunto en el orden en que se agregaron estos elementos.
quitar(Objeto o) Elimina el elemento especificado de este conjunto si está presente.
removeAll(Colección<?> c) Elimina de este conjunto todos sus elementos que están contenidos en la colección especificada.
removeIf(Predicado<? super E> filtro) Elimina todos los elementos de esta colección que satisfacen el predicado dado.
retenerTodo(Colección<?> c) Conserva solo los elementos de este conjunto que están contenidos en la colección especificada.
Talla() Devuelve el número de elementos de este conjunto.
divisor() Devuelve un Spliterator sobre los elementos de este conjunto en el orden en que se agregaron estos elementos.
aArray() Devuelve una array que contiene todos los elementos de este conjunto.
aArray(T[] a) Devuelve una array que contiene todos los elementos de este conjunto; el tipo de tiempo de ejecución de la array devuelta es el de la array especificada.

Métodos heredados de la clase java.util.AbstractSet

MÉTODO

DESCRIPCIÓN

código hash() Devuelve el valor del código hash para este conjunto.

Métodos heredados de la clase java.util.AbstractCollection

MÉTODO

DESCRIPCIÓN

Enstringr() Devuelve una representación de string de esta colección.

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

MÉTODO

DESCRIPCIÓN

flujoParalelo() Devuelve un Stream posiblemente paralelo con esta colección como fuente.
corriente() Devuelve un Stream secuencial con esta colección como fuente.

HashSet frente a CopyOnWriteArraySet

PROPIEDAD

HashSet

CopyOnWriteArraySet

Paquete Pertenece al paquete java.util Pertenece al paquete java.util.concurrent
Sincronización La sincronización significa que solo un subproceso puede acceder o modificarlo. HashSet no está sincronizado. Está sincronizado.
iteradores Los iteradores devolvieron mis métodos iterator( ) y listiterator() son a prueba de fallas . Los iteradores devueltos son a prueba de fallas .
Agregado en la versión Fue agregado en JDK 1.2 Se agregó en JDK 1.5
Actuación Es rápido ya que no está sincronizado. Es más lento en comparación con HashSet ya que está sincronizado.
Excepción Puede lanzar ConcurrentModificationException ya que muchos subprocesos pueden acceder a él simultáneamente.  No lanza ConcurrentModificationException ya que está sincronizado.

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 *