Liste de tableaux, copie superficielle itérer ou clone()
J'ai besoin d'une copie de java ArrayList
, dois-je utiliser clone()
ou itérer sur la liste d'origine et la copie des éléments à new arrayList, qui est plus rapide ?
Lors de la saisie de la question, vous devriez avoir vu une liste de question a été sauté vers le haut (la même liste que vous voyez en bas à droite de la colonne de cette page). Avez-vous jeter un regard autour de ceux-ci? Pourquoi n'étaient pas ces réponses sont-elles suffisantes? Veuillez fournir des précisions.
Je l'ai fait aller sur la fenêtre pop-up. Il n'y avait rien liée à la performance en termes de liste de tableaux itérateur vs clone().
Je l'ai fait aller sur la fenêtre pop-up. Il n'y avait rien liée à la performance en termes de liste de tableaux itérateur vs clone().
OriginalL'auteur tech20nn | 2010-04-07
Vous devez vous connecter pour publier un commentaire.
Utilisation
clone()
, ou utiliser le constructeur par copie.Le constructeur par copie supplémentaire de la transformation de la collection de tableau, alors que le
clone()
méthode utilise le tableau interne directement.Avoir à l'esprit que
clone()
retourneObject
, de sorte que vous aurez à jeter àList
.Je ne voudrais pas de se soucier de l'efficacité. À l'aide de clone() est une douleur; il suffit d'utiliser la conversion constructeur comme le suggère.
Bourrillion pourquoi pensez-vous à l'aide de
clone()
est la douleur? La mise en œuvre declone()
est la douleur, ne l'utilisez pas.Habituellement, vous ne voulez jamais à écrire beaucoup de code qui dépend de la classe d'implémentation,
ArrayList
; le universellement acceptée sur la meilleure pratique est de limiter votre dépendance à l'interface des types commeList
. Mais vous ne pouvez pas cloner unList
sans savoir exactement ce type de mise en œuvre (ArrayList
,LinkedList
, etc.) vous pouvez abattu à la première! Ensuite, une fois que vous obtenez le résultat, c'est unObject
, de sorte que vous avez à jeter! En plus de cela, certaines implémentations ne vais pas la peine de les avaler leur propreCloneNotSupportedException
s. Et pire encore, parce que c'est d'autant plus pénible (cont.)... que de la simple conversion des constructeurs, de nombreuses bibliothèques ne sont tout simplement pas aller à la peine de jouer le clone jeu à tous. La communauté est en grande partie en a marre de tout cela. Je vous suggère juste complètement oublier que le concept de clonage il existe encore, à l'exception peut-être de temps en temps le clonage d'un tableau, ce qui est très pratique. Franchement, la situation est tellement mauvaise que je suis choqué d'entendre quelqu'un faire valoir que l'utilisation de ce n'est pas une douleur!
OriginalL'auteur Bozho
Pas nécessaire d'itérer:
http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29
cependant, ce n'est pas thread-safe. (terminé jusqu'ici parce que je suis ConcurrentModificationException le faire)
OriginalL'auteur Bart Kiers
Au lieu d'itération manuellement, vous pouvez utiliser le constructeur de copie.
Que pour la différence de vitesse entre celle-ci et à l'aide de
clone()
:J'aime l'universel "devrais-je optimiser?" schéma de pensée
OriginalL'auteur Michael Borgwardt
la question, dit shallowcopy pas propriétédeepcopy.La copie directement référence à partir d'une liste de tableaux de référence à un autre travaillera aussi à droite.Copie en profondeur inclut la copie élément individuel dans arraylist.
Est-il un problème ??
ArrayList
objet en mémoire. L'ajout d'unInteger
à une liste rend leInteger
apparaissent également dans l'autre liste. Ce n'est pas ce que nous voulons. La copie superficielle rend les objets sous-jacents à partager le même espace mémoire, mais les listes d'avoir un espace mémoire séparé. Donc, si vous modifiez l'unInteger
, il sera modifié dans les deux listes. Mais si vous ajoutez unInteger
dans une liste, il n'apparaît pas dans l'autre. Copie en profondeur ne sera pas tenir compte de tout changement à quoi que ce soit dans l'autre liste.OriginalL'auteur Gaurav Kaushik