Sobes.tech
Junior

Koks yra efektyviausias būdas kopijuoti masyvą?

sobes.tech AI

Atsakymas iš AI

Paprastų duomenų tipų ir objektų be giluminio kopijavimo efektyviausi būdai yra:

  1. System.arraycopy(): Nativus metodas, optimizuotas greitam kopijavimui.

    // Pavyzdys naudojant System.arraycopy
    int[] sourceArray = {1, 2, 3, 4, 5};
    int[] destinationArray = new int[sourceArray.length];
    System.arraycopy(sourceArray, 0, destinationArray, 0, sourceArray.length);
    
  2. Arrays.copyOf(): Patogus metodas iš Arrays klasės, kuris viduje naudoja System.arraycopy().

    // Pavyzdys naudojant Arrays.copyOf
    int[] sourceArray = {1, 2, 3, 4, 5};
    int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);
    

Giluminio kopijavimo atveju (kai reikia kopijuoti ne tik nuorodas, bet ir pačius objektus, į kuriuos jos nurodo) gali būti reikalingi kiti metodai, pavyzdžiui:

  1. Cloneable sąsajos įgyvendinimas ir clone() metodo perrašymas:

    // Pavyzdys įgyvendinant Cloneable ir `clone()`
    class MyObject implements Cloneable {
        int value;
        MyObject innerObject;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            MyObject cloned = (MyObject) super.clone();
            // giluminis vidinio objekto kopijavimas
            cloned.innerObject = (MyObject) this.innerObject.clone();
            return cloned;
        }
    }
    
  2. Kopijavimo konstruktoriaus naudojimas:

    // Pavyzdys kopijavimo konstruktoriaus
    class MyObject {
        int value;
        MyObject innerObject;
    
        public MyObject(MyObject other) {
            this.value = other.value;
            // giluminis vidinio objekto kopijavimas
            this.innerObject = new MyObject(other.innerObject);
        }
    }
    
  3. Serijalizacijos/deserializacijos naudojimas (pavyzdžiui, naudojant ByteArrayInputStream ir ObjectInputStream): Gali būti neefektyvu dideliems masyvams ar objektams, kurie neįgyvendina Serializable.

  4. Trečiųjų šalių bibliotekų naudojimas (pavyzdžiui, Apache Commons Lang SerializationUtils.clone() metodas):

Efektyviausia plokščio (paviršinio) kopijavimo atveju yra System.arraycopy() arba Arrays.copyOf(). Giluminio kopijavimo dažnai pageidautina naudoti kopijavimo konstruktorių.