J'ai besoin d'une copie superficielle d'un Java ArrayList
, devrais-je utiliser ou itérer sur la liste originale et copier des éléments dans new arrayList, ce qui est plus rapide?ArrayList copie superficielle iterate ou clone()
Répondre
Utilisez clone()
, ou utilisez le constructeur de copie.
Le constructeur de copie effectue une transformation supplémentaire de la collection transmise à la matrice, tandis que la méthode clone()
utilise directement la matrice interne.
Gardez à l'esprit que clone()
renvoie Object
, vous devrez donc passer à List
.
Exactement j'ai regardé le code source java.util.ArrayList et j'ai trouvé que le clone() utilise Array.copyof, ce qui serait beaucoup plus efficace que de boucler sur l'original ArrayList. clone public Object() {try { @SuppressWarnings ("non vérifiées") ArrayList
Je ne m'inquiéterais pas beaucoup de l'efficacité. L'utilisation de clone() est une douleur; utilisez simplement le constructeur de conversion comme suggéré. –
@Kevin Bourrillion Pourquoi pensez-vous que l'utilisation de 'clone()' est une douleur? Implémenter 'clone()' est une douleur, ne pas l'utiliser. – Bozho
Pas besoin d'itérer:
List original = ...
List shallowCopy = new ArrayList(original);
http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29
Au lieu d'effectuer une itération manuelle, vous pouvez utiliser le copy constructor.
Quant à la différence de vitesse entre cela et l'utilisation clone()
:
- Peu importe
- Très probablement il n'y a pas
- Faites une référence pour votre configuration spécifique du système et cas d'utilisation
@ Michael..Merci. J'ai vérifié le code pour le constructeur de copie. Il a une étape supplémentaire pour retourner la structure de tableau interne de copie comme Bozho mentionné. ArrayList (Collection extends E> c) { elementData = c.toArray(); size = élémentData.length; if (elementData.getClass()! = Object []. Class) elementData = Arrays.copyOf (élémentData, taille, Object []. Class); } – tech20nn
J'aime l'universel "dois-je optimiser?" motif de pensée –
la question dit shallowcopy pas deepcopy.Copying référence directement à partir d'une référence arraylist à une autre fonctionnera également right.Ceep copie comprend copie individuelle élément dans arraylist.
ArrayList<Integer> list=new ArrayList<Integer>();
list.add(3);
ArrayList<Integer> list1=list; //shallow copy...
Y at-il un problème dans ce ??
Ceci est faux. Tout ce qui va faire, c'est qu'il y aura deux pointeurs vers un objet physique 'ArrayList' en mémoire. L'ajout d'un 'Integer' à une liste fait apparaître' Integer' aussi dans l'autre liste. Ce n'est pas ce que nous voulons. La copie superficielle permet aux objets sous-jacents de partager le même espace mémoire, mais les listes doivent avoir un espace mémoire séparé. Donc, si vous modifiez un 'Integer', il sera modifié dans les deux listes. Mais si vous ajoutez un 'Integer' dans une liste, il n'apparaîtra pas dans l'autre liste. Une copie en profondeur ne reflétera aucun changement à quoi que ce soit dans l'autre liste. – Antimonit
- 1. qu'est-ce qu'une copie superficielle du tableau
- 2. Copie superficielle en Java
- 3. problème de copie superficielle!
- 4. Question simple - Copie superficielle (VB.Net)
- 5. numéro de JSTL forEach iterate from arrayList
- 6. Copie profonde [] et ArrayList Java
- 7. structDelete n'affecte pas la copie superficielle?
- 8. Question sur tableau copie superficielle en C#
- 9. Question à propos de la copie superficielle en C++
- 10. Comment faire une copie superficielle d'une référence de hachage Perl?
- 11. SQLAlchemy: copie superficielle en évitant le chargement paresseux
- 12. Clone (copie en profondeur) Entité LINQ
- 13. Java Iterate Over Collection
- 14. copie des valeurs ArrayList en lui-même
- 15. ArrayList sans le surcoût de copie?
- 16. Liste ou ArrayList? (Beaucoup d'éléments)
- 17. Iterate Hash Map
- 18. Git - copie de travail maître identique à clone copie de travail
- 19. VB.NET ArrayList à la liste (Of T) tapé copie/conversion
- 20. qui est le meilleur Copyto() ou Clone()?
- 21. Iterate dans un UItableview - iphone
- 22. Javascript Iterate gestionnaires d'événements/écouteurs
- 23. Iterate liste d'objets dans Ibatis
- 24. StringCollection ou ArrayList dans la classe
- 25. Dois-je utiliser un ArrayList ou IList
- 26. Utiliser Hashtable, Vector ou HashMap ou ArrayList dans Java
- 27. Est-ce que SVN a un équivalent pour "hg clone" dans Mercurial ou "git clone" dans Git?
- 28. Clone objet entier graphique
- 29. Iterate les fichiers et lire les enregistrements
- 30. Farmville clone
Lors de la saisie de la question, vous auriez dû voir apparaître une liste de questions connexes (la même liste que vous voyez dans la colonne en bas à droite de cette page). Avez-vous regardé autour d'eux? Pourquoi ces réponses n'étaient-elles pas suffisantes? S'il vous plaît élaborer. – BalusC
Je suis allé sur le pop up. Il n'y avait rien de lié à la performance en termes de itérateur ArrayList vs clone(). – tech20nn