J'ai un tableau a
qui est constamment mis à jour. Disons a = [1,2,3,4,5]
. Je dois faire une copie exacte de a
et l'appeler b
. Si a
je devais changer [6,7,8,9,10]
, b
je devrais l'être [1,2,3,4,5]
. Quelle est la meilleure façon de procéder? J'ai essayé une for
boucle comme:
for(int i=0; i<5; i++) {
b[i]=a[i]
}
mais cela ne semble pas fonctionner correctement. Veuillez ne pas utiliser de termes avancés comme copie profonde, etc., car je ne sais pas ce que cela signifie.
System.arraycopy
, vous verrez que la méthode doit vérifier diverses choses avant de commencer. Certaines de ces vérifications sont inutiles avec une boucle de copie, selon les types de tableaux statiques.clone()
se révèle être le plus rapide pour 250 000 éléments.src.clone()
est plus lisible et a beaucoup moins de possibilités d'erreur que d'allouer un nouveau tableau et de le fairearraycopy
. (Et se trouve également être rapide.)vous pouvez utiliser
ainsi que.
la source
Si vous souhaitez faire une copie de:
C'est la voie à suivre:
Arrays.copyOf
peut être plus rapide quea.clone()
sur les petits tableaux. Les deux éléments de copie sont également rapides mais clone () renvoieObject
donc le compilateur doit insérer un transtypage implicite versint[]
. Vous pouvez le voir dans le bytecode, quelque chose comme ceci:la source
Belle explication de http://www.journaldev.com/753/how-to-copy-arrays-in-java
Méthodes de copie de tableau Java
la source
J'ai le sentiment que toutes ces "meilleures façons de copier un tableau" ne vont pas vraiment résoudre votre problème.
Vous dites
En regardant cette boucle, il n'y a aucune raison évidente pour qu'elle ne fonctionne pas ... à moins que:
a
etb
foirés (par exemplea
et faitesb
référence au même tableau), oua
tableau simultanément.Dans les deux cas, d'autres façons de faire la copie ne résoudront pas le problème sous-jacent.
La solution pour le premier scénario est évidente. Pour le deuxième scénario, vous devrez trouver un moyen de synchroniser les threads. Les classes de tableaux atomiques n'aident pas car elles n'ont pas de constructeurs de copie atomique ou de méthodes de clonage, mais la synchronisation à l'aide d'un mutex primitif fera l'affaire.
(Il y a des indices dans votre question qui m'amènent à penser que c'est effectivement lié au thread; par exemple, votre déclaration qui
a
change constamment.)la source
Vous pouvez essayer d'utiliser Arrays.copyOf () en Java
la source
Toutes les solutions qui appellent la longueur du tableau, ajoutez votre code redondant null checkersconsider exemple:
Je vous recommande de ne pas inventer la roue et d'utiliser la classe utilitaire où toutes les vérifications nécessaires ont déjà été effectuées. Considérez ArrayUtils d'apache commons. Votre code devient plus court:
Apache commons vous pouvez y trouver
la source
Vous pouvez également utiliser
Arrays.copyOfRange
.Exemple :
Cette méthode est similaire à
Arrays.copyOf
, mais elle est plus flexible. Les deux utilisentSystem.arraycopy
sous le capot.Voir :
la source
Pour une copie null-safe d'un tableau, vous pouvez également utiliser une option avec la
Object.clone()
méthode fournie dans cette réponse .la source
Optional
objet n'est qu'un objet vide avec une référence au tableau existant. En ce qui concerne l'impact sur les performances, je dirais qu'il est prématuré de dire qu'il s'agit en fait d'un impact, car ce type de construction est un bon candidat pour être intégré à la JVM et donc pas plus d'impact que les autres méthodes. C'est une question de style (programmation fonctionnelle versus programmation procédurale mais pas seulement) de la considérer comme plus compliquée ou non.Si vous devez travailler avec des tableaux bruts et non
ArrayList
alorsArrays
a ce que vous avez besoin. Si vous regardez le code source, ce sont les meilleures façons d'obtenir une copie d'un tableau. Ils ont une bonne programmation défensive parce que laSystem.arraycopy()
méthode lève beaucoup d'exceptions non contrôlées si vous lui donnez des paramètres illogiques.Vous pouvez utiliser l'un ou l'autre
Arrays.copyOf()
qui copiera du premierNth
élément vers le nouveau tableau plus court.ou
Arrays.copyOfRange()
fera aussi l'affaire:Comme vous pouvez le voir, ces deux fonctions ne sont que des fonctions d'encapsulation
System.arraycopy
avec une logique défensive selon laquelle ce que vous essayez de faire est valide.System.arraycopy
est le moyen le plus rapide de copier des tableaux.la source
J'ai eu un problème similaire avec les tableaux 2D et je me suis arrêté ici. Je copiais le tableau principal et modifiais les valeurs des tableaux internes, et j'ai été surpris lorsque les valeurs ont changé dans les deux copies. Fondamentalement, les deux copies étaient indépendantes mais contenaient des références aux mêmes tableaux internes et j'ai dû créer un tableau de copies des tableaux internes pour obtenir ce que je voulais.
Ce n'est probablement pas le problème du PO, mais j'espère qu'il pourra toujours être utile.
la source