407 Stimmen

Kopie eines Arrays erstellen

Ich habe ein Array a die ständig aktualisiert wird. Sagen wir a = [1,2,3,4,5] . Ich muss ein exaktes Duplikat von a und nennen es b . Wenn a zu ändern wären [6,7,8,9,10] , b sollte noch sein [1,2,3,4,5] . Wie kann ich dies am besten tun? Ich habe versucht, eine for Schleifen wie:

for(int i=0; i<5; i++) {
    b[i]=a[i];
}

aber das scheint nicht richtig zu funktionieren. Bitte verwenden Sie keine fortgeschrittenen Begriffe wie "deep copy" usw., denn ich weiß nicht, was das bedeutet.

18voto

Sie können versuchen, Arrays.copyOf() in Java zu verwenden

int[] a = new int[5]{1,2,3,4,5};
int[] b = Arrays.copyOf(a, a.length);

9voto

Cherry Punkte 28010

Alle Lösungen, die Länge von Array aufrufen, fügen Sie Ihren Code redundant null checkersconsider Beispiel:

int[] a = {1,2,3,4,5};
int[] b = Arrays.copyOf(a, a.length);
int[] c = a.clone();

//What if array a comes as local parameter? You need to use null check:

public void someMethod(int[] a) {
    if (a!=null) {
        int[] b = Arrays.copyOf(a, a.length);
        int[] c = a.clone();
    }
}

Ich empfehle Ihnen, das Rad nicht zu erfinden und Dienstprogrammklasse zu verwenden, wo alle notwendigen Prüfungen bereits durchgeführt haben. Betrachten Sie ArrayUtils von Apache Commons. Ihr Code wird kürzer:

public void someMethod(int[] a) {
    int[] b = ArrayUtils.clone(a);
}

Apache Commons können Sie finden dort

9voto

ROMANIA_engineer Punkte 50874

Sie können auch Folgendes verwenden Arrays.copyOfRange .

Exemple :

public static void main(String[] args) {
    int[] a = {1,2,3};
    int[] b = Arrays.copyOfRange(a, 0, a.length);
    a[0] = 5;
    System.out.println(Arrays.toString(a)); // [5,2,3]
    System.out.println(Arrays.toString(b)); // [1,2,3]
}

Diese Methode ist vergleichbar mit Arrays.copyOf aber sie ist flexibler. Beide verwenden System.arraycopy unter der Haube.

Siehe :

4voto

Wenn Sie mit rohen Arrays arbeiten müssen und nicht ArrayList puis Arrays hat, was Sie brauchen. Wenn Sie sich den Quellcode ansehen, sind dies die absolut besten Möglichkeiten, um eine Kopie eines Arrays zu erhalten. Sie haben ein gutes Stück defensiver Programmierung, weil die System.arraycopy() Methode löst viele ungeprüfte Ausnahmen aus, wenn Sie ihr unlogische Parameter übergeben.

Sie können entweder Arrays.copyOf() die von der ersten nach der zweiten Seite kopiert wird. Nth Element in das neue kürzere Array.

public static <T> T[] copyOf(T[] original, int newLength)

Kopiert das angegebene Array, wobei es abgeschnitten oder aufgefüllt wird damit die Kopie die angegebene Länge hat. [ ] sowohl im ursprünglichen Array als auch in der Kopie gültig sind, werden die beiden Arrays identische Werte enthalten. Für alle Indizes, die in der Kopie gültig sind gültig sind, aber nicht im Original, enthält die Kopie Null. Solche Indizes werden existieren nur, wenn die angegebene Länge größer ist als die des Original-Array ist. Das resultierende Array hat genau dieselbe Klasse wie das ursprüngliche Array.

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    }

o Arrays.copyOfRange() ist ebenfalls geeignet:

public static <T> T[] copyOfRange(T[] original, int from, int to)

Kopiert den angegebenen Bereich des angegebenen Arrays in ein neues Array. Der Anfangsindex des Bereichs (from) muss zwischen null und original.length, einschließlich. Der Wert an original[from] wird in das das erste Element der Kopie (es sei denn from == original.length oder von == bis). Die Werte der nachfolgenden Elemente des ursprünglichen Arrays werden in die nachfolgenden Elemente der Kopie eingefügt. Der letzte Index des Bereichs (to), der größer als oder gleich from sein muss, kann größer als original.length sein, in diesem Fall wird Null in alle Elemente der Kopie, deren Index größer oder gleich ist original.length - from. Die Länge des zurückgegebenen Arrays ist to - von. Das resultierende Array hat genau die gleiche Klasse wie das ursprüngliche Array.

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    }

Wie Sie sehen können, sind diese beiden Funktionen nur Wrapper-Funktionen über System.arraycopy mit defensiver Logik, dass das, was Sie zu tun versuchen, gültig ist.

System.arraycopy ist der absolut schnellste Weg, Arrays zu kopieren.

3voto

Nicolas Henneaux Punkte 10607

Für eine null-sichere Kopie eines Arrays können Sie auch ein optionales mit der Object.clone() Methode, die in dieser Antwort .

int[] arrayToCopy = {1, 2, 3};
int[] copiedArray = Optional.ofNullable(arrayToCopy).map(int[]::clone).orElse(null);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X