System.arraycopy în Java

Copiază rapid o bucată dintr-un array în alt array (sau în același array), la o poziție aleasă.

Sintaxă
static void arraycopy(Object sursa, int pozSursa, Object destinatie, int pozDest, int lungime)

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[] în long[]): compilatorul nu te oprește, dar la rulare primești ArrayStoreException.

Comenzi înrudite

  • Array-uri: Un array păstrează un număr fix de elemente de același tip, accesate prin indice de la 0 la length – 1.
  • System: Clasa care leagă programul de sistem: ieșirea standard (out), ieșirea de erori (err), intrarea (in), timpul, variabilele și setările.