98 votes

Existe-t-il un équivalent de memcpy() en Java ?

J'ai un byte[] et je voudrais le copier dans un autre byte[]. Peut-être que je montre ici mes simples connaissances en 'C', mais existe-t-il un équivalent de memcpy() sur les tableaux d'octets en Java ?

123voto

Zaki Points 3453

Utilisez System.arraycopy()

System.arraycopy(sourceArray, 
                 sourceStartIndex,
                 targetArray,
                 targetStartIndex,
                 length);

Exemple,

String[] source = { "alpha", "beta", "gamma" };
String[] target = new String[source.length];
System.arraycopy(source, 0, target, 0, source.length);

ou utiliser Arrays.copyOf()
Exemple,

target = Arrays.copyOf(source, length);

java.util.Arrays.copyOf(byte[] source, int length) a été ajouté dans le JDK 1.6.

Le site copyOf() la méthode utilise System.arrayCopy() pour faire une copie du tableau, mais est plus flexible que clone() puisque vous pouvez faire des copies des parties d'un tableau.

91voto

Tom Points 2773

Vous pouvez essayer System.arraycopy ou utiliser les fonctions de tableau dans le Arrays classe comme java.util.Arrays.copyOf . Les deux devraient vous offrir des performances natives sous le capot.

Arrays.copyOf est probablement favorable à la lisibilité, mais n'a été introduit qu'en java 1.6.

 byte[] src = {1, 2, 3, 4};
 byte[] dst = Arrays.copyOf(src, src.length);
 System.out.println(Arrays.toString(dst));

12voto

McDowell Points 62645

Si vous voulez juste une copie exacte d'un tableau unidimensionnel, utilisez [clone()](http://java.sun.com/javase/6/docs/api/java/lang/Object.html#clone()) .

byte[] array = { 0x0A, 0x01 };
byte[] copy = array.clone();

Pour les autres opérations de copie de tableau, utilisez System.arrayCopy / Arrays.copyOf como Tom suggère .

En général, clone devrait être évitée, mais il s'agit d'une exception à la règle.

5voto

mdma Points 33973

Vous pouvez utiliser System.arrayCopy . Il copie les éléments d'un tableau source vers un tableau de destination. L'implémentation Sun utilise un assembleur optimisé pour la main, donc c'est rapide.

4voto

Peter Schaeffer Points 98

Java a en fait quelque chose comme memcpy(). La classe Unsafe possède une méthode copyMemory() qui est essentiellement identique à memcpy(). Bien sûr, comme memcpy(), elle ne fournit aucune protection contre les superpositions de mémoire, la destruction de données, etc. Il n'est pas clair si c'est vraiment un memcpy() ou un memmove(). Il peut être utilisé pour copier d'adresses réelles à des adresses réelles ou de références à des références. Notez que si des références sont utilisées, vous devez fournir un offset (ou la JVM mourra ASAP).

Unsafe.copyMemory() fonctionne (jusqu'à 2 Go par seconde sur mon vieux PC fatigué). A utiliser à vos risques et périls. Notez que la classe Unsafe n'existe pas pour toutes les implémentations de la JVM.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X