Copie de jeux en Java

1. Vue d'ensemble

En termes simples, un ensemble est une collection qui ne contient aucun élément en double. En Java, Set est une interface qui étend l' interface Collection .

Dans ce rapide tutoriel, nous allons passer en revue différentes manières de copier des ensembles en Java.

2. Copier le constructeur

Une façon de copier un Set est d'utiliser le constructeur de copie d'une implémentation Set :

Set copy = new HashSet(original);

Un constructeur de copie est un type spécial de constructeur utilisé pour créer un nouvel objet en copiant un objet existant.

Ici, nous ne clonons pas vraiment les éléments de l'ensemble donné. Nous copions simplement les références d'objet dans le nouvel ensemble. Pour cette raison, chaque modification apportée à un élément affectera les deux ensembles.

3. Set.addAll

L' interface Set a une méthode addAll . Il ajoute les éléments de la collection à l'ensemble cible. Par conséquent, nous pouvons utiliser la méthode addAll pour copier les éléments d'un ensemble existant dans un ensemble vide:

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

4. Set.clone

Gardons à l'esprit que Set est une interface qui étend l' interface Collection , nous devons donc nous référer à un objet qui implémente l' interface Set pour créer une autre instance d'un Set . HashSet , TreeSet , LinkedHashSet et EnumSet sont tous des exemples d' implémentations de Set en Java.

Toutes ces implémentations de Set ont une méthode de clonage puisqu'elles implémentent toutes l' interface clonable .

Donc, comme autre approche pour copier un ensemble, nous pouvons appeler la méthode de clonage de l'ensemble :

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

Notons également que le clonage provient à l'origine de Object.clone . Les implémentations définies remplacent la méthode clone de la classe Object . La nature du clone dépend de la mise en œuvre réelle. Par exemple, HashSet ne fait qu'une copie superficielle, bien que nous puissions coder notre façon de faire une copie profonde.

Comme nous pouvons le voir, nous sommes obligés de transtyper l'objet cloné en Set car la méthode clone renvoie en fait un Object .

5. JSON

Une autre approche pour copier un ensemble consiste à le sérialiser dans une chaîne JSON et à créer un nouvel ensemble à partir de la chaîne JSON générée . Il convient également de noter que pour cette approche, tous les éléments de l'ensemble et les éléments référencés doivent être sérialisables et que nous effectuerons une copie complète de tous les objets .

Dans cet exemple, nous allons copier l'ensemble en utilisant les méthodes de sérialisation et de désérialisation de la bibliothèque Gson de Google :

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

6. Apache Commons Lang

Apache Commons Lang a une classe SerializationUtils qui fournit une méthode spéciale - clone - qui peut être utilisée pour cloner un objet donné. Nous pouvons utiliser cette méthode pour copier un ensemble:

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

Notons que SerializationUtils.clone s'attend à ce que son paramètre étende la classe Serializable .

7. Collectors.toSet

Ou, nous pouvons utiliser l' API Stream de Java 8 avec des collecteurs pour cloner un ensemble:

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

L'un des avantages de l' API Stream est qu'elle offre plus de commodité en nous permettant d'utiliser des sauts, des filtres, etc.

8. Utilisation de Java 10

Java 10 apporte une nouvelle fonctionnalité dans l' interface Set qui nous permet de créer un ensemble immuable à partir des éléments d'une collection donnée :

Set copy = Set.copyOf(original);

Notez que Set.copyOf attend un paramètre non nul .

9. Conclusion

Dans cet article, nous avons exploré différentes manières de copier des ensembles en Java.

Comme toujours, consultez le code source de nos exemples, y compris celui de Java 10.