Sobes.tech
Junior

Mi a leghatékonyabb módszer egy tömb másolására?

sobes.tech MI

Válasz az MI-től

Az alapvető típusok és mély másolat nélküli objektumok esetén a leghatékonyabb módszerek:

  1. System.arraycopy(): natív módszer, amely optimalizált gyors másolásra.

    // Példa a System.arraycopy() használatára
    int[] sourceArray = {1, 2, 3, 4, 5};
    int[] destinationArray = new int[sourceArray.length];
    System.arraycopy(sourceArray, 0, destinationArray, 0, sourceArray.length);
    
  2. Arrays.copyOf(): kényelmes módszer az Arrays osztályból. Belsőleg a System.arraycopy()-t használja.

    // Példa az Arrays.copyOf() használatára
    int[] sourceArray = {1, 2, 3, 4, 5};
    int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);
    

A mély másoláshoz (amikor nem csak a hivatkozásokat, hanem a hivatkozott objektumokat is másolni kell) más megközelítések lehetnek szükségesek, például:

  1. A Cloneable interfész megvalósítása és a clone() metódus felülírása. Nem ajánlott új fejlesztésekhez, mivel számos problémát okozhat.

    // Cloneable és clone() példája
    class MyObject implements Cloneable {
        int value;
        MyObject innerObject;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            MyObject cloned = (MyObject) super.clone();
            // mély másolás a belső objektumról
            cloned.innerObject = (MyObject) this.innerObject.clone();
            return cloned;
        }
    }
    
  2. Másoló konstruktor használata.

    // Másoló konstruktor példája
    class MyObject {
        int value;
        MyObject innerObject;
    
        public MyObject(MyObject other) {
            this.value = other.value;
            // mély másolás a belső objektumról
            this.innerObject = new MyObject(other.innerObject);
        }
    }
    
  3. Szerializáció/deszerializáció használata (pl. ByteArrayInputStream és ObjectInputStream segítségével). Hatékonytalan lehet nagy tömbök vagy Serializable-t nem implementáló objektumok esetén.

  4. Külső könyvtárak használata (pl. Apache Commons Lang SerializationUtils.clone() metódusával).

A leghatékonyabb módszer a felületi (lapos) másoláshoz primitív típusok és egyszerű objektumok esetén a System.arraycopy() vagy az Arrays.copyOf(). Mély másoláshoz gyakran a másoló konstruktor a preferált.