CopyOnWriteArrayList en Java

La clase CopyOnWriteArrayList se introduce en JDK 1.5, que implementa la interfaz List . Es una versión mejorada de ArrayList en la que todas las modificaciones (agregar, establecer, eliminar, etc.) se implementan haciendo una copia nueva. Se encuentra en el paquete java.util.concurrent . Es una estructura de datos creada para ser utilizada en un entorno concurrente.
 

CopyOnWriteArrayList in Java

Aquí hay algunos puntos sobre CopyOnWriteArrayList: 

  • Como su nombre lo indica, CopyOnWriteArrayList crea una copia clonada de ArrayList subyacente, para cada operación de actualización en un punto determinado, ambas se sincronizarán automáticamente, de lo cual se encargará JVM. Por lo tanto, no hay ningún efecto para los subprocesos que realizan operaciones de lectura.
  • Su uso es costoso porque por cada operación de actualización se creará una copia clonada. Por lo tanto, CopyOnWriteArrayList es la mejor opción si nuestra operación frecuente es la operación de lectura.
  • La estructura de datos subrayada es una array capaz de crecer.
  • Es una versión segura para subprocesos de ArrayList.
  • Se conserva la inserción, se permiten objetos duplicados, nulos y heterogéneos.
  • El principal punto importante sobre CopyOnWriteArrayList es que el iterador de CopyOnWriteArrayList no puede realizar la operación de eliminación; de lo contrario, obtenemos una excepción en tiempo de ejecución que dice UnsupportedOperationException. Los métodos add() y set() en el iterador CopyOnWriteArrayList también lanzan UnsupportedOperationException. Además, el iterador de CopyOnWriteArrayList nunca lanzará ConcurrentModificationException .

Declaración:

la clase pública CopyOnWriteArrayList<E> extiende Object implements List<E>, RandomAccess, Cloneable, Serializable

Aquí, E es el tipo de elementos que se encuentran en esta colección.

Nota: La clase implementa las interfaces Serializable , Cloneable , Iterable<E> , Collection<E> , List<E> , RandomAccess .

Constructores:

1. CopyOnWriteArrayList() : crea una lista vacía.

CopyOnWriteArrayList c = new CopyOnWriteArrayList();

2. CopyOnWriteArrayList(Collection obj) : crea una lista que contiene los elementos de la colección especificada, en el orden en que son devueltos por el iterador de la colección.

CopyOnWriteArrayList c = new CopyOnWriteArrayList(Collection obj);

3. CopyOnWriteArrayList(Objeto[] obj); : Crea una lista que contiene una copia de la array dada.

CopyOnWriteArrayList c = new CopyOnWriteArrayList(Object[] obj);

Ejemplo: 

Java

// Java program to illustrate
// CopyOnWriteArrayList class
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
 
public class ConcurrentDemo extends Thread {
 
    static CopyOnWriteArrayList<String> l
        = new CopyOnWriteArrayList<String>();
 
    public void run()
    {
        // Child thread trying to
        // add new element in the
        // Collection object
        l.add("D");
    }
 
    public static void main(String[] args)
        throws InterruptedException
    {
        l.add("A");
        l.add("B");
        l.add("c");
 
        // We create a child thread
        // that is going to modify
        // ArrayList l.
        ConcurrentDemo t = new ConcurrentDemo();
        t.run();
 
        Thread.sleep(1000);
 
        // Now we iterate through
        // the ArrayList and get
        // exception.
        Iterator itr = l.iterator();
        while (itr.hasNext()) {
            String s = (String)itr.next();
            System.out.println(s);
            Thread.sleep(1000);
        }
        System.out.println(l);
    }
}
Producción

A
B
c
D
[A, B, c, D]

 

Iterando sobre CopyOnWriteArrayList: Podemos iterar sobre CopyOnWriteArrayList usando el método iterator() . El punto importante a tener en cuenta es que el iterador que creamos es una instantánea inmutable de la lista original. Debido a esta propiedad, podemos ver que GfG no se imprime en la primera iteración.

Java

// Java program to illustrate
// CopyOnWriteArrayList class
import java.io.*;
import java.util.*;
import java.util.concurrent.*;
 
class Demo {
    public static void main(String[] args)
    {
 
        CopyOnWriteArrayList<String> list
            = new CopyOnWriteArrayList<>();
 
        // Initial Iterator
        Iterator itr = list.iterator();
        list.add("GfG");
        System.out.println("List contains: ");
        while (itr.hasNext())
            System.out.println(itr.next());
 
        // iterator after adding an element
        itr = list.iterator();
        System.out.println("List contains:");
        while (itr.hasNext())
            System.out.println(itr.next());
    }
}
Producción

List contains: 
List contains:
GfG

Métodos de CopyOnWriteArrayList:

MÉTODO

DESCRIPCIÓN

añadir (E e) Agrega el elemento especificado al final de esta lista.
agregar (índice int, elemento E) Inserta el elemento especificado en la posición especificada en esta lista.
addAll(Colección<? extiende E> c) Agrega todos los elementos de la colección especificada al final de esta lista, en el orden en que los devuelve el iterador de la colección especificada.
addAll(índice int, Colección<? extiende E> c) Inserta todos los elementos de la colección especificada en esta lista, comenzando en la posición especificada.
addAllAbsent(Colección<? extiende E> c) Agrega todos los elementos de la colección especificada que aún no están incluidos en esta lista, al final de esta lista, en el orden en que los devuelve el iterador de la colección especificada.
añadir si está ausente (E e) Agrega el elemento, si no está presente.
clear() Elimina todos los elementos de esta lista.
clon() Devuelve una copia superficial de esta lista.
contiene(Objeto o) Devuelve verdadero si esta lista contiene el elemento especificado.
contieneTodo(Colección<?> c) Devuelve verdadero si esta lista contiene todos los elementos de la colección especificada.
 es igual a (Objeto o) Compara el objeto especificado con esta lista 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.
 obtener (índice int) Devuelve el elemento en la posición especificada en esta lista.
 código hash() Devuelve el valor del código hash para esta lista.
indexOf(E e, índice int) Devuelve el índice de la primera aparición del elemento especificado en esta lista, buscando hacia adelante desde el índice, o devuelve -1 si no se encuentra el elemento.
indexOf(Objeto o) Devuelve el índice de la primera aparición del elemento especificado en esta lista, o -1 si esta lista no contiene el elemento.
esta vacio() Devuelve verdadero si esta lista no contiene elementos.
iterador() Devuelve un iterador sobre los elementos de esta lista en la secuencia adecuada.
lastIndexOf(E e, índice int) Devuelve el índice de la última aparición del elemento especificado en esta lista, buscando hacia atrás desde el índice, o devuelve -1 si no se encuentra el elemento.
lastIndexOf(Objeto o) Devuelve el índice de la última aparición del elemento especificado en esta lista, o -1 si esta lista no contiene el elemento.
listaIterador() Devuelve un iterador de lista sobre los elementos de esta lista (en la secuencia adecuada).
listIterator(índice int) Devuelve un iterador de lista sobre los elementos de esta lista (en la secuencia adecuada), comenzando en la posición especificada en la lista.
eliminar (índice int) Elimina el elemento en la posición especificada en esta lista.
quitar(Objeto o) Elimina la primera aparición del elemento especificado de esta lista, si está presente.
removeAll(Colección<?> c) Elimina de esta lista todos sus elementos que están contenidos en la colección especificada.
 removeIf(Predicado<? super E> filter) Elimina todos los elementos de esta colección que satisfacen el predicado dado.
replaceAll (operador UnaryOperator<E>) Reemplaza cada elemento de esta lista con el resultado de aplicar el operador a ese elemento.
retenerTodo(Colección<?> c) Conserva solo los elementos de esta lista que están contenidos en la colección especificada.
conjunto (índice int, elemento E) Reemplaza el elemento en la posición especificada en esta lista con el elemento especificado.
 Talla() Devuelve el número de elementos de esta lista.
sort(Comparador<? super E> c) Ordena esta lista de acuerdo con el orden inducido por el Comparador especificado.
divisor() Devuelve un Spliterator sobre los elementos de esta lista.
 subLista(int fromIndex, int toIndex) Devuelve una vista de la parte de esta lista entre fromIndex, inclusive, y toIndex, exclusivo.
aArray() Devuelve una array que contiene todos los elementos de esta lista en la secuencia adecuada (del primero al último elemento).
 aArray(T[] a) Devuelve una array que contiene todos los elementos de esta lista en la secuencia adecuada (desde el primero hasta el último elemento); el tipo de tiempo de ejecución de la array devuelta es el de la array especificada.
 Enstringr() Devuelve una representación de string de esta lista.

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.

Nota: Deberíamos usar CopyOnWriteArrayList cuando preferimos usar una estructura de datos similar a ArrayList en un entorno concurrente.

Debe leer:

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 *