Ce face System.arraycopy
System.arraycopy copiază lungime elemente din sursa, începând de la pozSursa, în destinatie, începând de la pozDest. Ambele array-uri trebuie să existe deja și să aibă tipuri compatibile. Copierea este făcută de JVM, foarte rapid.
Sursa și destinația pot fi același array, chiar cu zone care se suprapun: copierea se face corect, ca și cum ar trece printr-o copie temporară. Așa poți muta elementele pentru a face loc unui element nou. Dacă vreun indice iese din array, metoda aruncă IndexOutOfBoundsException. Pentru o copie nouă completă, Arrays.copyOf este mai simplu.
Parametri
| Parametru | Descriere |
|---|---|
sursa |
Array-ul din care copiezi. |
pozSursa |
Poziția primului element copiat. |
destinatie |
Array-ul în care copiezi. |
pozDest |
Poziția unde se scrie primul element. |
lungime |
Câte elemente se copiază. |
Ce returnează
Nimic (void); destinația este modificată.
Exemple
Exemplul 1: Copierea unei părți dintr-un array
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] note = {5, 7, 9, 10, 8, 6};
int[] mijloc = new int[3];
System.arraycopy(note, 2, mijloc, 0, 3);
System.out.println(Arrays.toString(mijloc));
}
}
Rezultat
[9, 10, 8]
Exemplul 2: Inserare într-un array prin mutare
Mutăm elementele de la poziția 1 cu un loc la dreapta (zone suprapuse, în același array), apoi scriem noul nume.
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] coada = {"Ana", "Ion", "Maria", null};
System.arraycopy(coada, 1, coada, 2, 2);
coada[1] = "Elena";
System.out.println(Arrays.toString(coada));
}
}
Rezultat
[Ana, Elena, Ion, Maria]
Exemplul 3: Lipirea a două array-uri
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] moldova = {"Iași", "Suceava"};
String[] ardeal = {"Cluj", "Sibiu", "Brașov"};
String[] toate = new String[moldova.length + ardeal.length];
System.arraycopy(moldova, 0, toate, 0, moldova.length);
System.arraycopy(ardeal, 0, toate, moldova.length, ardeal.length);
System.out.println(Arrays.toString(toate));
try {
System.arraycopy(ardeal, 0, moldova, 0, 3);
} catch (IndexOutOfBoundsException e) {
System.out.println("Eroare: " + e.getMessage());
}
}
}
Rezultat
[Iași, Suceava, Cluj, Sibiu, Brașov]
Eroare: arraycopy: last destination index 3 out of bounds for object array[2]
Greșeli frecvente
- Destinația nu este creată:
int[] copie = null; System.arraycopy(a, 0, copie, 0, 3);aruncăNullPointerException. Creează întâi array-ul cu dimensiunea potrivită. - Copiezi între array-uri de tipuri incompatibile (de exemplu
int[]înlong[]): compilatorul nu te oprește, dar la rulare primeștiArrayStoreException.