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 .
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()); } }
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