Sobes.tech
Junior

Aký je najefektívnejší spôsob kopírovania poľa?

sobes.tech AI

Odpoveď od AI

Pre primitívnych typov dát a objektov bez hlbokého kopírovania sú najúčinnejšie nasledujúce spôsoby:

  1. System.arraycopy(): Nativná metóda, optimalizovaná na rýchle kopírovanie.

    // Príklad použitia 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(): Pohodlná metóda z triedy Arrays. Vo vnútri používa System.arraycopy().

    // Príklad použitia Arrays.copyOf
    int[] sourceArray = {1, 2, 3, 4, 5};
    int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);
    

Pre hlboké kopírovanie objektov (keď je potrebné skopírovať nielen odkazy, ale aj samotné objekty, na ktoré odkazujú) môžu byť potrebné iné prístupy, ako napríklad:

  1. Implementácia rozhrania Cloneable a prepísanie metódy clone(). Neodporúča sa pre nové vývoja kvôli mnohým problémom.

    // Príklad implementácie Cloneable a clone()
    class MyObject implements Cloneable {
        int value;
        MyObject innerObject;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            MyObject cloned = (MyObject) super.clone();
            // hlboké kopírovanie vnútorného objektu
            cloned.innerObject = (MyObject) this.innerObject.clone();
            return cloned;
        }
    }
    
  2. Použitie konštruktora kopírovania.

    // Príklad konštruktora kopírovania
    class MyObject {
        int value;
        MyObject innerObject;
    
        public MyObject(MyObject other) {
            this.value = other.value;
            // hlboké kopírovanie vnútorného objektu
            this.innerObject = new MyObject(other.innerObject);
        }
    }
    
  3. Použitie serializácie/deserializácie (napríklad pomocou ByteArrayInputStream a ObjectInputStream). Môže byť neefektívne pre veľké polia alebo objekty, ktoré neimplementujú Serializable.

  4. Použitie tretích knižníc (napríklad Apache Commons Lang s metódou SerializationUtils.clone()).

Najefektívnejším pre ploché (povrchové) kopírovanie primitívnych typov a jednoduchých objektov je System.arraycopy() alebo Arrays.copyOf(). Pre hlboké kopírovanie je často vhodnejší konštruktor kopírovania.