devstory

Le Tutoriel de Java CopyOnWriteArraySet

  1. CopyOnWriteArraySet
  2. Examples

1. CopyOnWriteArraySet

CopyOnWriteArraySet est une classe qui implémente l'interface Set, qui est couramment utilisée dans un environnement multithreading, et les opérations de traversée d'éléments sont plus couramment utilisées que les opérations mutables comme add, remove, clear.
public class CopyOnWriteArraySet<E> extends AbstractSet<E> implements java.io.Serializable
CopyOnWriteArraySet gère un objet CopyOnWriteArrayList qu'il contient. Toutes les opérations add, remove, clear seront effectuées sur CopyOnWriteArrayList et s'assureront qu'il ne contient pas d'éléments dupliqués.
CopyOnWriteArraySet est un Set thread-safe. Ce sera plus facile à comprendre si vous passez un peu de temps à lire l'article sur CopyOnWriteArrayList ci-dessous :
A chaque fois que vous effectuez une opération modifiable comme add, remove, clear cela créera un nouveau tableau pour stocker des éléments. Ainsi, le coût d'utilisation de CopyOnWriteArraySet est très élevé, vous devez payer plus pour les ressources et les performances. Cependant CopyOnWriteArraySet est pratique lorsque vous ne pouvez pas ou ne voulez pas vous synchroniser en parcourant les éléments du Set.
Lorsque vous créez un objet Iterator (ou Stream) à partir de CopyOnWriteArraySet, il traverse les éléments du tableau actuel (lorsque Iterator ou Stream a été créé). Les éléments de ce tableau resteront inchangés pendant la durée de vie d'Iterator (ou Stream). Ceci est possible car toute opération add, remove, clear... sur CopyOnWriteArraySet créera un autre tableau qui est une copie du tableau actuel.
L'objet Iterator obtenu à partir de CopyOnWriteArraySet ne prend pas en charge l'opération Iterator.remove, s'il est utilisé intentionnellement, vous obtiendrez UnsupportedOperationException.

2. Examples

Exemple : Itérer sur les éléments de CopyOnWriteArraySet en utilisant Iterator, ce qui vous aidera à itérer sur les éléments du tableau actuel (au moment de la création de l'Iterator).
CopyOnWriteArraySetEx1.java
package org.o7planning.copyonwritearrayset.ex;

import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

public class CopyOnWriteArraySetEx1 {

    public static void main(String[] args) {
        // Create a CopyOnWriteArraySet object:
        Set<String> set = new CopyOnWriteArraySet<String>();
        set.add("A");
        set.add("B");
        set.add("C");
        
        Iterator<String> iterator1 = set.iterator();
        
        set.add("X1");
        set.add("X2");
        
        Iterator<String> iterator2 = set.iterator();
        
        System.out.println("--- Iterator 1: -----");
        while(iterator1.hasNext()) {
            System.out.println(iterator1.next());
        }
        
        System.out.println("--- Iterator 2: -----");
        while(iterator2.hasNext()) {
            System.out.println(iterator2.next());
        }
    }
}
Output:
--- Iterator 1: -----
A
B
C
--- Iterator 2: -----
A
B
C
X1
X2
Remarque: Iterator de CopyOnWriteArraySet ne prend pas en charge l'opération Iterator.remove.
Stream:
Parcourir les éléments de CopyOnWriteArraySet à travers de Stream donne le même résultat qu'Iterator.
CopyOnWriteArraySetEx2.java
package org.o7planning.copyonwritearrayset.ex;

import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Stream;

public class CopyOnWriteArraySetEx2 {

    public static void main(String[] args) {
        // Create a CopyOnWriteArraySet object:
        Set<String> set = new CopyOnWriteArraySet<String>();
        set.add("A");
        set.add("B");
        set.add("C");  
        
        Stream<String> stream1 = set.stream();
        
        set.add("X1");
        set.add("X2");
        
        Stream<String> stream2 = set.stream();
        
        System.out.println("--- Stream 1: -----");
        stream1.forEach(System.out::println);
        
        System.out.println("--- Stream 2: -----");
        stream2.forEach(System.out::println);
    }
}
Output:
--- Stream 1: -----
A
B
C
--- Stream 2: -----
A
B
C
X1
X2
En plus des caractéristiques spéciales mentionnées ci-dessus, CopyOnWriteArraySet est également un Set normal, vous pouvez trouver d'autres exemples de Set dans l'article ci-dessous :