Sobes.tech
Junior

Jaký je nejefektivnější způsob kopírování pole?

sobes.tech AI

Odpověď od AI

Pro primitivní datové typy a objekty bez hluboké kopie jsou nejúčinnější následující způsoby:

  1. System.arraycopy(): Nativní metoda optimalizovaná pro rychlé kopírování.

    // Příklad použití 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á metoda ze třídy Arrays. Interně používá System.arraycopy().

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

Pro hluboké kopírování objektů (když je třeba kopírovat nejen odkazy, ale i objekty, na které odkazují) mohou být potřeba jiné přístupy, například:

  1. Implementace rozhraní Cloneable a přepsání metody clone(). Nedoporučuje se pro nové vývoje kvůli mnoha problémům.

    // Příklad implementace Cloneable a clone()
    class MyObject implements Cloneable {
        int value;
        MyObject innerObject;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            MyObject cloned = (MyObject) super.clone();
            // hluboká kopie vnitřního objektu
            cloned.innerObject = (MyObject) this.innerObject.clone();
            return cloned;
        }
    }
    
  2. Použití konstruktoru kopie.

    // Příklad konstruktoru kopie
    class MyObject {
        int value;
        MyObject innerObject;
    
        public MyObject(MyObject other) {
            this.value = other.value;
            // hluboká kopie vnitřního objektu
            this.innerObject = new MyObject(other.innerObject);
        }
    }
    
  3. Použití serializace/deserializace (například s ByteArrayInputStream a ObjectInputStream). Může být neefektivní pro velké pole nebo objekty, které neimplementují Serializable.

  4. Použití externích knihoven (například Apache Commons Lang s metodou SerializationUtils.clone()).

Nejúčinnější pro povrchové (ploché) kopírování primitivních typů a jednoduchých objektů je System.arraycopy() nebo Arrays.copyOf(). Pro hluboké kopírování je často preferován konstruktor kopie.