Sobes.tech
Junior

Mis on kõige tõhusam viis massiivi kopeerimiseks?

sobes.tech AI

Vastus AI-lt

Primitiivsete andmetüüpide ja lihtsate objektide pinnakopiamiseks on kõige tõhusamad järgmised viisid:

  1. System.arraycopy(): Natiivne meetod, optimeeritud kiireks kopeerimiseks.

    // Näide kasutades 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(): Mugav meetod Arrays klassist, mis kasutab sisemiselt System.arraycopy():

    // Näide kasutades Arrays.copyOf()
    int[] sourceArray = {1, 2, 3, 4, 5};
    int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);
    

Sügava koopiana (kui on vaja kopeerida mitte ainult viiteid, vaid ka iseobjekte, millele need viitavad) võivad olla vajalikud teised meetodid, näiteks:

  1. Cloneable liidese rakendamine ja clone() meetodi ülekirjutamine:

    // Näide, rakendades Cloneable ja `clone()`
    class MyObject implements Cloneable {
        int value;
        MyObject innerObject;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            MyObject cloned = (MyObject) super.clone();
            // sügav koopia sisemisele objektile
            cloned.innerObject = (MyObject) this.innerObject.clone();
            return cloned;
        }
    }
    
  2. Koopia konstruktorite kasutamine:

    // Näide koopia konstruktorist
    class MyObject {
        int value;
        MyObject innerObject;
    
        public MyObject(MyObject other) {
            this.value = other.value;
            // sügav koopia sisemisele objektile
            this.innerObject = new MyObject(other.innerObject);
        }
    }
    
  3. Seriaalimise/deserialiseerimise kasutamine (näiteks ByteArrayInputStream ja ObjectInputStream abil): Võib olla ebaefektiivne suurte massiivide või objektide puhul, mis ei rakenda Serializable.

  4. Kolmanda osapoole teekide kasutamine (näiteks Apache Commons Lang SerializationUtils.clone() meetod):

Kõige tõhusam pinnakopiamiseks (pinnalise) primitiivsete tüüpide ja lihtsate objektide puhul on System.arraycopy() või Arrays.copyOf(). Sügava koopia jaoks on sageli eelistatav kasutada koopia konstruktorit.