web-dev-qa-db-fra.com

Java HashMap - copie complète

J'essaie juste de trouver la meilleure solution pour créer une copie complète de HashMap. Il n'y a aucun objet dans cette carte qui implémente Cloneable. Je voudrais trouver une meilleure solution que la sérialisation et la désérialisation.

16
Smolda

Jetez un œil à Deep Cloning , sur Google Code, vous pouvez trouver une bibliothèque. Vous pouvez le lire sur https://github.com/kostaskougios/cloning .

Son fonctionnement est simple. Cela peut cloner n'importe quel objet, et l'objet n'a pas à implémenter d'interfaces, comme sérialisable.

Cloner cloner = new Cloner();
MyClass clone = cloner.deepClone(o);
// clone is a deep-clone of o

Attention cependant: cela peut cloner des milliers d'objets (si l'objet cloné a autant de références). De plus, la copie de fichiers ou de flux peut provoquer un crash de la JVM.

Vous pouvez cependant ignorer certaines instances de classes, comme streams et cetera. Cela vaut la peine de vérifier cette bibliothèque et sa source.

13
stealthjong

Je ne pense pas qu'il puisse être mis en œuvre de manière générique.

  • Si vous avez la possibilité de simplement implémenter le clone, j'irais dans ce sens.
  • Un peu plus complexe crée une carte de type, où vous recherchez une sorte de classe d'implémentation de clone basée sur la classe de chaque objet
  • Lorsque les objets pourraient former un graphe acyclique dirigé, je garderais en général une carte de l'original au clone de chaque objet que j'ai jamais vu, et vérifier si je l'ai déjà fait
  • Lorsque vous avez un graphique général, le problème devient vraiment désagréable. Vous pourriez avoir d'étranges contraintes de l'ordre de création d'objet, cela pourrait même être impossible lorsque vous avez des champs finaux.

Pour l'instant, je vous propose de réécrire votre question de manière moins générale

3
hyperman

Ce n'est pas facile, nous utilisons une sorte de solution:

1) convertissez la carte en chaîne json. (par exemple, en utilisant Google Gson)

2) reconvertissez la chaîne json en carte.

Notez qu'il y a un problème de performances, mais c'est une manière plus simple.

1
GMsoF