2010-07-20 4 views
2

Je veux faire une copie profonde d'un objet [] et ArrayList Comment puis-je faire (sans boucle, et appelant clone)Copie profonde [] et ArrayList Java

Il n'y a pas utils standards pour faire cela?

Merci João

+0

Une copie profonde aura une boucle conceptuelle quelconque. La question est de savoir si elle est cachée à l'intérieur d'un utilitaire ou non. – corsiKa

+0

Dupe? http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object-in-java –

+0

Allez-vous modifier la copie? – Arkadiy

Répondre

2

Aucun objet trivial ne doit en fournir pour prendre en charge la copie: même si cela prend la forme de l'implémentation de Clonage ou de Sérialisation. C'est plus ou moins pourquoi il n'y a pas de méthode intégrée et la boucle est inévitable.

Si c'est tout votre propre code alors je recommanderais un constructeur de copie sur clone ou serialize/deserialize car c'est plus OO; vous demandez à l'objet de créer sa propre copie plutôt que de demander à la JVM de faire une copie de bas niveau. Un tel code est très simple et facile à lire si je l'espère moins cher de maintenir à long terme:

public class Widget { 
    private int x = 0; 
    public Widget(Widget copyMe){ 
     this.x = copyMe.x; 
     // ... 
    } 
    // .... 
} 

Vous avez encore besoin d'une boucle bien sûr en boucle sur l'ancienne collection invoquant le constructeur de copie pour remplir la nouvelle collection. Il y a un livre intitulé Java efficace qui contient beaucoup de détails sur les pièges du clonage et de la sérialisation que je recommande fortement.

Il existe certains systèmes qui nécessitent vraiment une copie et un tri très rapide et similaires (par exemple Hadoop). De tels systèmes obligent le développeur à prendre en charge un format binaire personnalisé (par exemple, byte [] getAsBytes()/public Widget (byte [] fromBytes)). Le regroupement de nombreux objets convertis en byte [] en un plus grand tableau signifie qu'ils peuvent tous être copiés en même temps très rapidement en utilisant System.arraycopy sur le grand tableau. La JVM va faire System.arraycopy en tant que copie de mémoire de bas niveau. Vous aurez toujours besoin de la boucle pour désérialiser les objets du morceau d'octets après la copie. En général, le compilateur et jvm ont tendance à optimiser très bien le code de base, donc à moins de mesurer réellement que vous avez un problème de performance réel et mesurable, alors une boucle très simple avec un constructeur de copie très lisible sera la meilleure approche.

2

Vous pouvez sérialiser tout le tableau et désérialiser puis dans une nouvelle variable. Cela fait effectivement une copie profonde.

Sinon, vous devrez implémenter une copie profonde par vous-même.

+0

Mais je pense que c'est pire que de boucler par des éléments n'est-ce pas? Cordialement –

+0

Seulement si le contenu ArrayList est sérialisable – naikus

+0

La sérialisation sera plus lente que la mise en boucle manuelle, mais est beaucoup plus simple, surtout si vous avez une hiérarchie d'objets complexe. – codymanix