Sobes.tech
Junior

Ի՞նչն է ամենաարդյունավետ միջոցը զանգվածը պատճենելու համար:

sobes.tech AI

Պատասխան AI-ից

Պարզ տեսակների տվյալների և օբյեկտների համար առանց խորը պատճենման, առավել արդյունավետ եղանակներն են՝

  1. System.arraycopy(): Նատիվ մեթոդ, օպտիմիզացված արագ պատճենման համար:

    // Օրինակ՝ 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(): Հարմար մեթոդ Arrays դասից, որը ներքինապես օգտագործում է System.arraycopy():

    // Օրինակ՝ Arrays.copyOf-ի օգտագործում
    int[] sourceArray = {1, 2, 3, 4, 5};
    int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);
    

Խորը պատճենման համար (երբ անհրաժեշտ է պատճենել ոչ միայն հղումները, այլ նաև ինքը օբյեկտները, որոնց վրա հղում է) կարող են անհրաժեշտ այլ մոտեցումներ, օրինակ՝

  1. Cloneable ինտերֆեյսի իրականացում և clone() մեթոդի վերագրում՝

    // Օրինակ՝ Cloneable և clone() իրականացում
    class MyObject implements Cloneable {
        int value;
        MyObject innerObject;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            MyObject cloned = (MyObject) super.clone();
            // խորը պատճենում՝ ներքին օբյեկտի
            cloned.innerObject = (MyObject) this.innerObject.clone();
            return cloned;
        }
    }
    
  2. Կոպիայի կոնստրուկտորի օգտագործում՝

    // Օրինակ՝ կոպիայի կոնստրուկտոր
    class MyObject {
        int value;
        MyObject innerObject;
    
        public MyObject(MyObject other) {
            this.value = other.value;
            // խորը պատճենում՝ ներքին օբյեկտ
            this.innerObject = new MyObject(other.innerObject);
        }
    }
    
  3. Սերիալիզացիայի/դեսերիալիզացիայի օգտագործում (օրինակ՝ ByteArrayInputStream և ObjectInputStream-ի միջոցով): Անարդյունավետ կարող է լինել մեծ զանգվածների կամ այն օբյեկտների համար, որոնք չեն իրականացնում Serializable:

  4. Երրորդ կողմի գրադարանների օգտագործում (օրինակ՝ Apache Commons Lang-ի SerializationUtils.clone() մեթոդով):

Ամենաարդյունավետը մակերեսային (պատկերային) պատճենման համար է՝ System.arraycopy() կամ Arrays.copyOf(): Խորը պատճենման համար հաճախ նախընտրելի է օգտագործել կոպիայի կոնստրուկտոր։