Si vous devez travailler avec des tableaux bruts et non ArrayList
alors Arrays
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 la System.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 premier Nth
élément vers le nouveau tableau plus court.
public static <T> T[] copyOf(T[] original, int newLength)
Copie le tableau spécifié, en le tronquant ou en le remplissant avec des valeurs nulles (si nécessaire) afin que la copie ait la longueur spécifiée. Pour tous les index valides à la fois dans le tableau d'origine et dans la copie, les deux tableaux contiendront des valeurs identiques. Pour tous les index valides dans la copie mais pas l'original, la copie contiendra null. De tels indices existeront si et seulement si la longueur spécifiée est supérieure à celle du tableau d'origine. Le tableau résultant est exactement de la même classe que le tableau d'origine.
2770
2771 public static <T,U> T[] More ...copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
2772 T[] copy = ((Object)newType == (Object)Object[].class)
2773 ? (T[]) new Object[newLength]
2774 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
2775 System.arraycopy(original, 0, copy, 0,
2776 Math.min(original.length, newLength));
2777 return copy;
2778 }
ou Arrays.copyOfRange()
fera aussi l'affaire:
public static <T> T[] copyOfRange(T[] original, int from, int to)
Copie la plage spécifiée du tableau spécifié dans un nouveau tableau. L'index initial de la plage (de) doit être compris entre zéro et la longueur d'origine, inclus. La valeur à l'original [de] est placée dans l'élément initial de la copie (sauf de == original.length ou de == to). Les valeurs des éléments suivants du tableau d'origine sont placées dans les éléments suivants de la copie. L'index final de la plage (to), qui doit être supérieur ou égal à from, peut être supérieur à original.length, auquel cas null est placé dans tous les éléments de la copie dont l'index est supérieur ou égal à original. longueur - de. La longueur du tableau retourné sera de - de. Le tableau résultant est exactement de la même classe que le tableau d'origine.
3035 public static <T,U> T[] More ...copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
3036 int newLength = to - from;
3037 if (newLength < 0)
3038 throw new IllegalArgumentException(from + " > " + to);
3039 T[] copy = ((Object)newType == (Object)Object[].class)
3040 ? (T[]) new Object[newLength]
3041 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
3042 System.arraycopy(original, from, copy, 0,
3043 Math.min(original.length - from, newLength));
3044 return copy;
3045 }
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.