Sobes.tech
Junior

Kāda ir efektīvākā veids, kā kopēt masīvu?

sobes.tech AI

Atbilde no AI

Primitīvo tipu un vienkāršu objektu virspusējas (pārklājošās) kopēšanas efektīvākie veidi ir:

  1. System.arraycopy(): Nativā metode, optimizēta ātrai kopēšanai.

    // Piemērs, izmantojot 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(): Ērta metode no Arrays klases, kas iekšēji izmanto System.arraycopy().

    // Piemērs, izmantojot Arrays.copyOf
    int[] sourceArray = {1, 2, 3, 4, 5};
    int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);
    

Dziļā kopēšana (kad nepieciešams kopēt ne tikai atsauces, bet arī pašus objektus, uz kuriem tie norāda) var prasīt citus paņēmienus, piemēram:

  1. Cloneable interfeisa īstenošana un clone() metodes pārdefinēšana:

    // Piemērs, īstenojot Cloneable un `clone()`
    class MyObject implements Cloneable {
        int value;
        MyObject innerObject;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            MyObject cloned = (MyObject) super.clone();
            // dziļa kopēšana iekšējā objekta
            cloned.innerObject = (MyObject) this.innerObject.clone();
            return cloned;
        }
    }
    
  2. Kopijas konstruktora izmantošana:

    // Piemērs, kopijas konstruktors
    class MyObject {
        int value;
        MyObject innerObject;
    
        public MyObject(MyObject other) {
            this.value = other.value;
            // dziļa kopēšana iekšējā objekta
            this.innerObject = new MyObject(other.innerObject);
        }
    }
    
  3. Serijalizācijas/deserializācijas izmantošana (piemēram, ar ByteArrayInputStream un ObjectInputStream): Var būt neefektīvi lieliem masīviem vai objektiem, kas neīsteno Serializable.

  4. Trešo pušu bibliotēku izmantošana (piemēram, Apache Commons Lang SerializationUtils.clone() metodi):

Efektīvākā ir virsmas (pārklājošās) kopēšana ar System.arraycopy() vai Arrays.copyOf(). Dziļā kopēšana bieži ir vēlams ar kopijas konstruktoru.