Copia di set in Java

1. Panoramica

In poche parole, un Set è una raccolta che non contiene elementi duplicati. In Java, Set è un'interfaccia che estende l' interfaccia Collection .

In questo rapido tutorial, esamineremo diversi modi per copiare i set in Java.

2. Copia costruttore

Un modo per copiare un Set è usare il costruttore di copia di un'implementazione Set :

Set copy = new HashSet(original);

Un costruttore di copia è un tipo speciale di costruttore utilizzato per creare un nuovo oggetto copiando un oggetto esistente.

Qui, non stiamo realmente clonando gli elementi del set dato. Stiamo solo copiando i riferimenti agli oggetti nel nuovo set. Per questo motivo, ogni modifica apportata a un elemento interesserà entrambi i set.

3. Set.addAll

L' interfaccia Set ha un metodo addAll . Aggiunge gli elementi nella raccolta alla serie di destinazioni. Pertanto, possiamo utilizzare il metodo addAll per copiare gli elementi di un set esistente in un set vuoto:

Set copy = new HashSet(); copy.addAll(original);

4. Set.clone

Teniamo presente che Set è un'interfaccia che estende l' interfaccia Collection , quindi dobbiamo fare riferimento a un oggetto che implementa l' interfaccia Set per creare un'altra istanza di un Set . HashSet , TreeSet , LinkedHashSet e EnumSet sono tutti esempi di implementazioni di Set in Java.

Tutte queste implementazioni di Set hanno un metodo clone poiché tutte implementano l' interfaccia Cloneable .

Quindi, come un altro approccio per copiare un set, possiamo chiamare il metodo clone del set :

Set copy = (Set) original.clone();

Notiamo anche che la clonazione proviene originariamente da Object.clone . Le implementazioni impostate sovrascrivono il metodo clone della classe Object . La natura del clone dipende dall'effettiva implementazione. Ad esempio, HashSet esegue solo una copia superficiale, sebbene possiamo codificare il nostro modo per eseguire una copia completa.

Come possiamo vedere, siamo costretti a typecast l'oggetto clonato su Set poiché il metodo clone restituisce effettivamente un Object .

5. JSON

Un altro approccio per copiare un set consiste nel serializzarlo in una stringa JSON e creare un nuovo set dalla stringa JSON generata . Vale anche la pena notare che per questo approccio tutti gli elementi nel set e gli elementi referenziati devono essere serializzabili e che eseguiremo una copia completa di tutti gli oggetti .

In questo esempio, copieremo il set utilizzando i metodi di serializzazione e deserializzazione della libreria Gson di Google :

Gson gson = new Gson(); String jsonStr = gson.toJson(original); Set copy = gson.fromJson(jsonStr, Set.class);

6. Apache Commons Lang

Apache Commons Lang ha una classe SerializationUtils che fornisce un metodo speciale - clone - che può essere utilizzato per clonare un determinato oggetto. Possiamo utilizzare questo metodo per copiare un set:

for (T item : original) { copy.add(SerializationUtils.clone(item)); }

Notiamo che SerializationUtils.clone si aspetta che il suo parametro estenda la classe Serializable .

7. Collectors.toSet

Oppure possiamo utilizzare l' API Stream di Java 8 con i servizi di raccolta per clonare un set:

Set copy = original.stream() .collect(Collectors.toSet());

Un vantaggio dell'API Stream è che offre maggiore praticità permettendoci di utilizzare salti, filtri e altro.

8. Utilizzo di Java 10

Java 10 introduce una nuova funzionalità nell'interfaccia Set che ci consente di creare un set immutabile dagli elementi di una data raccolta :

Set copy = Set.copyOf(original);

Notare che Set.copyOf prevede un parametro non nullo .

9. Conclusione

In questo articolo, abbiamo esplorato diversi modi di copiare i set in Java.

Come sempre, controlla il codice sorgente per i nostri esempi, incluso quello per Java 10.